永发信息网

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

答案:6  悬赏:40  手机版
解决时间 2021-11-25 09:42
  • 提问者网友:最美的风景
  • 2021-11-25 00:27
求助:C语言,大整数的加法。可达10^10,000,000位数的。。。
最佳答案
  • 五星知识达人网友:拾荒鲤
  • 2021-11-25 00:38
简单的两数相加肯定不行,必须用字符串。下面是我上学的时候编的,不知道能不能用,你看看。
#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;
}
}
全部回答
  • 1楼网友:独钓一江月
  • 2021-11-25 06:02
首先你的字符串开的太小,至少应是10000000,再说这样大的数已不适合用直接的加法了。有更高效的做法,网上有很多。
  • 2楼网友:平生事
  • 2021-11-25 04:54
#include
#include
#define N 100000000
char a[N],b[N];
char *p1=a,*p2=b;
void main()
{
int i=0,j=0;
gets(a);
gets(b);
if( strlen(a) < strlen(b) ) {p1=b;p2=a;}
i=( strlen(a) > strlen(b) )? ( strlen(a) ):( strlen(b) );
j=( strlen(a) < strlen(b) )? ( strlen(a) ):( strlen(b) );
for(i--,j--;j>=0;i--,j--)
*(p1+i) = *(p1+i) + *(p2+j) - 48;
puts(p1);
}
*******************************************************************************************************************
这是我的答案,我把数组长度定义为了1亿,我在VC6.0中运行过了,没问题,处理“大数的和”这样的问题,基本思路是用字符串(定义字符数组)来处理,再加上指针处理起来就很方便了……
备注:还有另外一个思路,就是定义四个相对来说小一点的字符数组,两个两个一组,第一个大数存储在前两个数组中,第二个大数存储在后两个数组中,同样可以处理,不过那就不能用gets了……
  • 3楼网友:山君与见山
  • 2021-11-25 03:24
整数整个做成一个科学记数法表示的对象
第二步:计算加法,从低到高合并同一计数级的对象
第三步:从高到低把这个对象转换成一个char数组,并打印出来
乘法是加法的升华:
第一步:拆成(a1+b1+c1...)*(a2+b2+c2...)格式。
第二步:做一个i*j次的循环,生成一个新的科学计数对象
第三步:从高到低把这个对象转换成一个char数组,并打印出来追问我也是这么做的。可是char数组,我只能开到10W,题目要1000W。一个字符放一位数还小了。我不知道是我算法有问题,还是思考方向有问题。
  • 4楼网友:街头电车
  • 2021-11-25 02:16
呵呵,占用的内存太多了,不好整所以猜出错的
#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');
}追问唔,一运行就显示错误了。。追答因为数据太大,所以就完了。你可以试着把N值奸笑看看看
  • 5楼网友:舍身薄凉客
  • 2021-11-25 01:07
在本地调试没有问题,估计是因为数组开的太大,你提交的时候编译环境可以选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;
后面不变追问我重新提交了,还是错误,我觉得,是不是我的数组太小了?
因为题目要求10^100000000,有1000W个字符长度,我的数组只开到10W。
想开更大,却不行了。追答我改成10000000的数组还是没出错啊,你提交的时候选了c++编译器没,还不行就把oj的地址贴出来我试试
还有一种方法就是只开一个数组,先把a读进来,然后一位一位的读b,边读边把结果加到a数组里面,这样只要原来1/3的空间
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯