求助:C语言,大整数的加法。可达10^10,000,000位数的。。。

2024-12-16 14:35:26
推荐回答(5个)
回答1:

简单的两数相加肯定不行,必须用字符串。下面是我上学的时候编的,不知道能不能用,你看看。
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "windows.h"
#include
//检查合法性
int check(char *a)
{
for(int i=0;i if(a[i]-'0'<0||a[i]-'0'>9)
return 0;
return 1;
}
//格式化字符串
void format(char *a,char *b)
{
int i;
int maxlen=0,minlen=0,lena=0,lenb=0;
maxlen=strlen(a)>strlen(b)?strlen(a):strlen(b);
minlen=strlen(a) lena=strlen(a);
lenb=strlen(b);
for(i=lena-1;i>=0;i--)
{
a[i+maxlen-lena+1]='0'; //初始化
a[i+maxlen-lena+1]=a[i];
}
for(i=0;i<=maxlen-lena;i++)
a[i]='0';
a[maxlen+1]='\0';
for(i=lenb-1;i>=0;i--)
{
b[i+maxlen-lenb+1]='0'; //初始化
b[i+maxlen-lenb+1]=b[i];
}
for(i=0;i<=maxlen-lenb;i++)
b[i]='0';
b[maxlen+1]='\0';
}
//加法
void add(char *a,char *b)
{
int c=0;
int d=0;
int pw=0;
int i=0;
int len=0;
format(a,b);
len=strlen(a);
char buffer[255]={"0"};
for(i=len-1;i>=0;i--)
{
c=a[i]-'0'+b[i]-'0';
d=c%10;
pw=c/10;
a[i-1]=a[i-1]+pw;
buffer[i]=d+'0';
}
buffer[len]='\0';
if(buffer[0]=='0')
printf("%s\n",buffer+1);
else
printf("%s\n",buffer);
}
//减法
void sub(char *a,char *b)
{
int i=0;
int abigger=0;
int bbigger=0;
format(a,b);
for(i=0;i {
if(a[i]>b[i])
{ abigger=1;break;}
else if(a[i] { bbigger=1;break;}
}
if(i==strlen(a))
{
printf("0");
return;
}
}
//主函数
int main(int argc, char* argv[])
{
char num1[256],num2[256];
char select;
loop:
printf("请输入数字:\n");
gets(num2);
gets(num1);
if(check(num1)==0||check(num2)==0)
{
printf("非法数字!!请检查输入!!!\n");
return 0;
}
printf("请选择运算:1:加法 2:减法 3:乘法 4:除法\n");
select=getchar();
switch(select)
{
case '1':
add(num1,num2);goto loop;break;
case '2':
sub(num1,num2);goto loop;break;
}
}

回答2:

在本地调试没有问题,估计是因为数组开的太大,你提交的时候编译环境可以选c++或gc++之类的,它们支持开的数组较大
还有就是要用大数组的话,最好定义成全局变量,全局变量存储在堆中,空间较大。函数内的局部变量存储在栈中,空间比较小。
还有就是交换字符串有个巧妙的办法,不用真正交换,而是用改变字符串指针的方法,具体代码如下
#include
#include
char s[100001];
char s11[100001];
char s22[100001];
int main()
{
int c,j,i,l;
char *s1=s11,*s2=s22;

scanf("%s",s1);

scanf("%s",s2);

if(strlen(s1) {
s1=s22;
s2=s11;
}
i=strlen(s1)-1;
j=strlen(s2)-1;
后面不变

回答3:

呵呵,占用的内存太多了,不好整所以猜出错的
#include
#include
#define N 10000000
void sswap(char str1[],char str2[])
{
char temp[N+2];
int i=0;
int m,n;
m=strlen(str1);
n=strlen(str2);
if(m>=n)
{
strcpy(temp,str1);
strcpy(str1,str2);
}
else strcpy(temp,str2);
n=0;
while(str1[i])
{
temp[i]+=str1[i]-'0';
i++;
}
while(temp[n])
{
temp[n+1]+=(temp[n]-'0')/10;
temp[n]=(temp[n]-'0')%10+'0';
n++;
}
strcpy(str2,temp);

}

void main()
{
char str1[N+1],str2[N+2];
printf("请输入大数a:");
gets(str1);
printf("请输入大数b:");
gets(str2);
sswap(str1,str2);
puts(str2);
putchar('\n');
}

回答4:

整数整个做成一个科学记数法表示的对象
第二步:计算加法,从低到高合并同一计数级的对象
第三步:从高到低把这个对象转换成一个char数组,并打印出来
乘法是加法的升华:
第一步:拆成(a1+b1+c1...)*(a2+b2+c2...)格式。
第二步:做一个i*j次的循环,生成一个新的科学计数对象
第三步:从高到低把这个对象转换成一个char数组,并打印出来

回答5:

首先你的字符串开的太小,至少应是10000000,再说这样大的数已不适合用直接的加法了。有更高效的做法,网上有很多。