永发信息网

c语言 大数相加

答案:4  悬赏:60  手机版
解决时间 2021-02-19 14:04
c语言 大数相加
最佳答案
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 位。实际编程时,不一定要费心思去把数组大小定得正好合适,稍微开大点也无所谓,以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
下面是具体程序:
#include
#include
#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;
}
全部回答

#include
void main()
{
char a[10],b[10];
int c[10]={0},d[10]={0},e[11]={0};
scanf("%s",&a);
scanf("%s",&b);
int k,i,f=0,max,min;
int dight=0,digit=1;//dight进位 digit总位数 
k=(strlen(a)-1);
i=(strlen(b)-1);
max=k>i?k:i;
min=kwhile(k!=-1)
{
d[f]=a[k]-48;
k--;
f++; 
}
f=0;
while(i!=-1)
{
c[f]=b[i]-48;
f++;
i--;
}
for(f=0;f<=min;f++)
{
e[f]=d[f]+c[f]+dight;
dight=0;
if(e[f]>9) 
{
if(f!=0)
{e[f]=e[f]-10;dight=1;}
else
{e[f]=e[f]-9;dight=1;}
}
digit++;
}
int s=1;
for(f=1;f<=(max-min);f++)
{
e[min+s]=a[min+s]+dight;
dight=0;
if(e[min+s]>9) {e[min+s]=e[min+s]-10;dight=1;}
s++;
digit++;
if(e[max]>9) digit++;
}
int u;
for(u=0;uprintf("%d",e[u]);
}
打我打
#include
#include
void main()
{
char a[10],b[10];
int c[10]={0},d[10]={0},e[11]={0};
scanf("%s",&a);
scanf("%s",&b);
int k,i,f=0,max,min;
int dight=0,digit=0;//dight进位 digit总位数
k=(strlen(a)-1);
i=(strlen(b)-1);
max=k>i?k:i;
min=k while(k!=-1)
{
d[f]=a[k]-48;
k--;
f++;
}
f=0;
while(i!=-1)
{
c[f]=b[i]-48;
f++;
i--;
}
for(f=0;f<=min;f++)
{
e[f]=d[f]+c[f]+dight;
dight=0;
if(e[f]>9)
{
//if(f!=0)
//{e[f]=e[f]-10;dight=1;}
//else
{e[f]=e[f]-10;dight=1;}//
}
digit++;
}
if((dight==1)&&((max-min)==0)){
e[f]+=dight;
digit++;
}
int s=1;
for(f=1;f<=(max-min);f++)
{
if(strlen(a)>strlen(b))e[min+s]=a[min+s]-48+dight;//
else e[min+s]=b[min+s]-48+dight;//
dight=0;
if(e[min+s]>9) {e[min+s]=e[min+s]-10;dight=1;}
s++;
digit++;
//if(e[max]>9) digit++;
}

int u;
for(u=0;u printf("%d",e[u]);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
糖类不含有,磷脂含有,蛋白质也不一定有,而
东森时尚百货东门地址在哪,我要去那里办事
真三国无双5吕布除了在虎牢关出现还有什么地
好听的英文名字女生
想知道: 郑州市陈寨双桥花卉在哪?
在学校一,二年级小学生呕吐了,呕吐物由谁清
下列推测正确的是 A.XeF 2 分子中各原子
将神经细胞置于相当于细胞外液的溶液S中,可
赖二娃夜啤酒在哪里啊,我有事要去这个地方
电脑开机就出现QQ安全中心提示账号存在异常
文科500分左右能考上海的什么大学啊?
请问动画片七龙珠孙悟空第一次变身到最后一次
吕梁国贸大酒店-商务中心我想知道这个在什么
有“绿色水库”之称的生态系统是湿地生态系统
车贷公司的还款日期(25日)和银行卡上的还款
推荐资讯
众鑫图文广告这个地址在什么地方,我要处理点
邳州市铁南汽车修理厂我想知道这个在什么地方
谁能推荐几部外国古装战争大片,最好是那种史
我最近脸上长了好多痘,而且一碰就很疼的那种
求正品360WiFi3代 得内部真实构造图片
横扇汽车客运站这个地址在什么地方,我要处理
考驾照报名时附带了张ic卡,上面的有效时间是
梦幻西游魔王寨技能多少秒4多少秒5
中标图文快印在哪里啊,我有事要去这个地方
夜里吃康师傅桶面会肥么
审稿状态副主编初定什么意思
阅读下面这首唐诗,然后回答问题。(8分)二
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?