中国社会九层分级:如何C语言中实现两个任意大小的整数的相加

来源:百度文库 编辑:高校问答 时间:2024/05/01 01:18:07
这个问题我已经做了7天了。现在还没有很彻底的完成这个问题。
问题在于任意个数,我用单链表实现了操作,但是占用的空间很大,
昨天用双向链表实现了。加法函数写了131行代码(任何语句都是一行,循环体不管多长,都用括号,括号占一行。)
然后觉得太长了,于是改进了方法,加法函数精简到81行,但是问题出现了。是否还可以精简呢??
希望有高手可以帮我解答这个问题。
这两个数是用户自己输入的。而且不考虑是不是内存够不够的情况。比如我输入2个1000亿的数进行相加,2个数由用户或者其他程序提供。

要实现任意大小两个整数相加,那么就不能存在溢出情况。所以无法使用任何系统类型,唯一的方式是用数组模拟整数存储,并自行实现加法操作算法。

需要注意以下几点:

1 大数如何存储及输出;

2 计算时进位的处理;

3 两个计算数长度不同时的处理;

4 当达到最高位仍有进位的处理,即结果的长度大于任意一个操作数。


以下是一个比较简单的代码:


#include <stdio.h>
#include <stdlib.h>

char s[101];
int sum[101];

int main() 
{
    int i, j;
    while (gets(s), strcmp(s, "0")) {//巧妙化解开多少个数组 算多少个数的和的局面
        j=strlen(s);
        for (i=j-1; i>=0; --i) {
            sum[j-i-1]+=(s[i]-'0');//s[i]-'0'表示字符数字转化成int数字  倒序加到sum中 sum第一个数是s的最后一个数的和
        }
    }
    j=101; while(!sum[j])--j;  //重新赋值j 使j为目前sum的总位数
    for (i=0;i<j;++i) {   //如果s[i]加成两位数 将十位数加给前一位数
        sum[i+1]+=sum[i]/10;
        sum[i]=sum[i]%10;
    }
    for (i=j; i>=0; --i) {
        printf("%d", sum[i]);
    }
}

 

首先你要定义这两个整数的类型;
因为是整数所以必然使用int
大小任意...
long long int a,b,c;
a = ;
b= ;
c = a + b;

http://zhidao.baidu.com/question/2261388.html
这是我以前给某个仁兄写的程序,无来还没有实现最后一个除法
其中实现了加法,减法(包括小数),乘法(不包括小数)

你可以参考看看,程序可以直接在C++环境运行(需要修改一些头文件)

先用random()生成随机数,这个数是任意大小的
然后做加法操作即可

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[201],arr2[201];
printf("请输入加数:");
scanf("%s",&arr1);
printf("请输入加数:");
scanf("%s",&arr2);
int len1=strlen(arr1);
int len2=strlen(arr2);
int i,f=0;
int a[201]={0};int b[201]={0};int sum[202]={0};
int j=0;
for(i=len1-1;i>=0;i--)
{
a[j++]=arr1[i]-'0';
}
j=0;
for(i=len2-1;i>=0;i--)
{
b[j++]=arr2[i]-'0';
}
int max=(len1>len2)?len1:len2;
for(i=0;i<max;i++)
{
sum[i]=a[i]+b[i];
}
for(i=0;i<max;i++)
{
if(sum[i]>=10&&i<max-1)
{
sum[i+1]++;
sum[i]-=10;
}
if(sum[i]>=10&&i==max-1)
{
f=1;
sum[i+1]++;
sum[i]-=10;
}
}
printf("计算结果为:");
if(f==1) printf("%d",f);
for(i=max-1;i>=0;i--)
{
printf("%d",sum[i]);
}
return 0;
}