重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这个只能用字符串来解决
成都创新互联-专业网站定制、快速模板网站建设、高性价比罗平网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式罗平网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖罗平地区。费用合理售后完善,10余年实体公司更值得信赖。
void fx(char *x,int n)
{
char *p1=x,*p2=x+n; //这个可能控制不好,也就是1个位置的误差,自己调整一下吧
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。可以带printf标示输入这两个数,随你
//反序a,b,这个可以做个子函数,
l1=strlen(a);
fx(a,l1);
l2=strlen(b);
fx(b,l2);
for(i=0;il1;i++) //转换成整数
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; //把前一位弄成个位数
}
//处理最高位
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位的整数,但有时我们需要计算位数非常长的整数或小数的加法。一般我们称这种基本数据类型无法表示的整数为大整数。如何表示和存放大整数呢?基本的思想就是:用数组存放和表示大整数。一个数组元素,存放大整数中的一位。
现在假如我们要计算俩个200位数的加法。显然,任何C/C++固有类型的变量都无法保存它。最直观的想法是可以用一个字符串来保存它。字符串本质上就是一个字符数组,因此为了编程更方便,我们也可以用数组int an[200]来保存一个200 位的整数,让an[0]存放个位数,an[1]存放十位数,an[2]存放百位数……那么如何实现两个大整数相加呢?方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10 则进位。也就是说,用int an1[201]保存第一个数,用int an2[200]表示第二个数,然后逐位相加,相加的结果直接存放在an1 中。要注意处理进位。另外,an1 数组长度定为201,是因为两个200 位整数相加,结果可能会有201 位。实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
下面是具体程序:
#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);
}