這個只能用字符串來解決
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比羅平網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式羅平網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋羅平地區(qū)。費用合理售后完善,10余年實體公司更值得信賴。
void fx(char *x,int n)
{
char *p1=x,*p2=x+n; //這個可能控制不好,也就是1個位置的誤差,自己調(diào)整一下吧
char t;
while(p1p2)
{t=*p1;*p1=*p2;*p2=t;p1++;p2++;}
}
main()
{
char a[100],b[100];
int c[100],d[100];e[101]={0};
int l1,l2,l3;
int i,n=100;
gets(a);
gets(b); //輸入a,b??梢詭rintf標(biāo)示輸入這兩個數(shù),隨你
//反序a,b,這個可以做個子函數(shù),
l1=strlen(a);
fx(a,l1);
l2=strlen(b);
fx(b,l2);
for(i=0;il1;i++) //轉(zhuǎn)換成整數(shù)
c[i]=a[i]-'0';
for(i=0;il2;i++)
d[i]=b[i]-'0';
l3=l1l2?l1:l2;
e[0]=c[0]+d[0];
for(i=1;il3;i++)
{
e[i]=c[i]+d[i]+e[i-1]/10; //加上前一位的進位
e[i-1]%=10; //把前一位弄成個位數(shù)
}
//處理最高位
e[i+1]=e[i]/10;
e[i]%=10;
//反序輸出就可以了,可以處理一下高位余下的零
while(!e[n])
n--;
for(i=n;i=0;i--)
printf("%d",e[i]);
}
基本思路就是這樣,我沒有運行,可能有些小錯誤,自己解決一下吧
c/c++中int和unsigned類型變量,都不能保存超過10位的整數(shù),但有時我們需要計算位數(shù)非常長的整數(shù)或小數(shù)的加法。一般我們稱這種基本數(shù)據(jù)類型無法表示的整數(shù)為大整數(shù)。如何表示和存放大整數(shù)呢?基本的思想就是:用數(shù)組存放和表示大整數(shù)。一個數(shù)組元素,存放大整數(shù)中的一位。
現(xiàn)在假如我們要計算倆個200位數(shù)的加法。顯然,任何C/C++固有類型的變量都無法保存它。最直觀的想法是可以用一個字符串來保存它。字符串本質(zhì)上就是一個字符數(shù)組,因此為了編程更方便,我們也可以用數(shù)組int an[200]來保存一個200 位的整數(shù),讓an[0]存放個位數(shù),an[1]存放十位數(shù),an[2]存放百位數(shù)……那么如何實現(xiàn)兩個大整數(shù)相加呢?方法很簡單,就是模擬小學(xué)生列豎式做加法,從個位開始逐位相加,超過或達到10 則進位。也就是說,用int?an1[201]保存第一個數(shù),用int an2[200]表示第二個數(shù),然后逐位相加,相加的結(jié)果直接存放在an1 中。要注意處理進位。另外,an1 數(shù)組長度定為201,是因為兩個200 位整數(shù)相加,結(jié)果可能會有201 位。實際編程時,不一定要費心思去把數(shù)組大小定得正好合適,稍微開大點也無所謂,以免不小心沒有算準(zhǔn)這個“正好合適”的數(shù)值,而導(dǎo)致數(shù)組小了,產(chǎn)生越界錯誤。
下面是具體程序:
#includestdio.h
#includestring.h
#defineMAX_LEN?200
int?an1[MAX_LEN+10];
int?an2[MAX_LEN+10];
charszLine1[MAX_LEN+10];
charszLine2[MAX_LEN+10];
int?main(void)
{
scanf("%s",?szLine1);
scanf("%s",?szLine2);
inti,?j;
memset(?an1,?0,?sizeof(an1));
memset(?an2,?0,?sizeof(an2));
int?nLen1?=?strlen(?szLine1);
for(?j?=?0,?i?=?nLen1?-?1;i?=?0?;?i--)
an1[j++]?=?szLine1[i]-?'0';
int?nLen2?=?strlen(szLine2);
for(?j?=?0,?i?=?nLen2?-?1;i?=?0?;?i--)
an2[j++]?=?szLine2[i]-?'0';
for(?i?=?0;i??MAX_LEN?;?i++?)?
{?an1[i]+=?an2[i];//逐位相加
if(?an1[i]?=?10?)?
{?//看是否要進位
an1[i]?-=?10;
an1[i+1]?++;?//進位
}
}
for(?i?=?MAX_LEN;?(i=?0)??(an1[i]?==?0);?i--?)?;
if(i=0)
for(?;?i?=?0;?i--)
printf("%d",?an1[i]);
else?????printf("0");
return?0;
}
效果:
代碼:
#includestdio.h
#includestring.h
void?reverse(char?s[])?{
int?len?=?strlen(s),?h?=?len?/?2;
char?temp;
for?(int?i?=?0;?i??h;?++i)?{
temp?=?s[i];
s[i]?=?s[len?-?i?-?1];
s[len?-?i?-?1]?=?temp;
}
}
#define?System?10
#define?MAX?24
const?char?mx?=?'9';
const?char?mn?=?'0';
char*?Sum(char?s1[],?char?s2[])?{
char?ans[MAX];
int?len1?=?strlen(s1),?len2?=?strlen(s2),?ad?=?0,?min?=?len1??len2???len1?:?len2,?max?=?len1len2???len1?:?len2,?i;
char*?st1,?*st2;
if?(len1??len2)?{?st1?=?s2;?st2?=?s1;?}
else?{?st1?=?s1;?st2?=?s2;?}
reverse(st1);
reverse(st2);
for?(i?=?0;?i??min;?i++)?{
ans[i]?=?st1[i]?+?st2[i]?-?'0'?+?ad;
if?(ans[i]??mx)?{
ans[i]?-=?System;
ad?=?1;
}
else?ad?=?0;
}
while?(ad?!=?0?||?i?max)?{
if?(i??max)ans[i]?=?st2[i]?+?ad;
else?ans[i]?=?mn?+?ad;
if?(ans[i]??mx)?{
ans[i]?-=?System;
ad?=?1;
}
else?ad?=?0;
i++;
}
ans[i]?=?'\0';
reverse(ans);
return?ans;
}
int?main()?{
char?A[21],?B[21],?C[50],?*ans;
int?n,?m;
scanf("%d?%d",?m,?n);
scanf("%s?%s",?A,?B);
ans?=?Sum(A,?B);
strcpy(C,?ans);
printf("%s\n",?C);
}