1. 程式人生 > >大整數加法 HDU1002

大整數加法 HDU1002

字符 一次 algorithm 相加 自己 size 核心 逆序輸出 讀取

今天早上沒事幹又把這個敲了一遍,雖然手凍得不行,不過又深入理解理解還可以哈。

難點就在給你的整數可能很大很長,所以long long 肯定不行,得用字符串來讀取存儲,然後註意一下相加的時候進位,最後輸出註意去0就OK啦。(核心思想就是大數逆序相加最後逆序再輸出就是正確結果了)。然後下邊是自己寫的思路比較清晰的代碼,大家可以借鑒後再自己想想有沒有更簡單的,可以互相學習呀。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace
std; char A[1005],B[1005]; int a[1005],b[1005],c[2002]; void nuxu()//簡單的逆序存入整型數組 { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); int k1=0,k2=0,ans; ans=strlen(A); for(int i=ans-1;i>=0;i--) a[k1++]=A[i]-0; ans=strlen(B); for(int i=ans-1;i>=0;i--) b[k2
++]=B[i]-0; } void yunsuan() { int k=strlen(A)>strlen(B)?strlen(A):strlen(B); int len=0; for(int i=0;i<k;i++) { c[i]+=a[i]+b[i]; if(c[i]>9)//進位操作,為什麽只用判一次,或者說只進位一次大家再自己想想啦; { c[i+1]++; c[i]-=10; } } } int main() { int
t,flag; scanf("%d",&t); for(int j=1;j<=t;j++) { flag=0; if(j!=1) printf("\n");//題目要求格式 scanf("%s%s",A,B); nuxu(); //寫main函數外邊更清晰,簡便點 yunsuan(); printf("Case %d:\n%s + %s = ",j,A,B);//以上是題目要求輸出格式 for(int i=1000;i>=0;i--)//逆序輸出 { if(c[i]!=0||flag==1)//直接控制去前導0了 { printf("%d",c[i]); flag=1; } } printf("\n"); } }

大整數加法 HDU1002