A + B Problem II
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 154489 Accepted Submission(s): 29230
大數問題。
解題思路:
既然int、double等都無法解決如此大的數,那麼我們可以用數組來解決。
PS:當然也可以考慮下__int64,是否能解決呢?它的範圍是多少呢?int和double的範圍是多少呢?Unsigned呢?
當然也要注意回車、數組大小、空格以及進位哦!
如果你還有興趣的話,你也可以考慮下100位的2進制數如何轉換成10進制數呢?100位的2進制數如何轉換成8進制數呢?
代碼:
#include<stdio.h>
#include<string.h>
int m,p=0,k=0;
void sum(char a[],char b[])
{
char s;
if(k<m){
s=a[k]+b[k]-48+p;p=0;
if((s-48)/10){
s-=10;
p=1;
}k++;
sum(a,b);
printf("%c",s);
}else if(p==1){printf("1");}
}
void reverse(char s[],int l)
{
int i,j,temp;
for(i=0,j=l-1;i<j;i++,j--)
{temp=s[i];s[i]=s[j];s[j]=temp;}
}
main()
{
char a[20][1000],b[20][1000];
int l1,l2,i,j,n;
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
scanf("%s",&a[i]);scanf("%s",&b[i]);
printf("Case %d:\n",i+1);
printf("%s + %s = ",a[i],b[i]);
l1=strlen(a[i]);l2=strlen(b[i]);
m=l1>l2?l1:l2;
reverse(a[i],l1);
reverse(b[i],l2);
if(l1>l2){
for(j=l2;j<l1;j++)
b[i][j]='0';
}
else if(l1<l2){
for(j=l1;j<l2;j++)
a[i][j]='0';
}
sum(a[i],b[i]);
p=0;k=0;
printf("\n");
if(i!=n-1) printf("\n");
}
}