NOI OJ 1.6 10:大整数加法 C语言

发布时间:2026/9/4 13:55:19
NOI OJ 1.6 10:大整数加法 C语言 描述求两个不超过200位的非负整数的和。输入有两行每行是一个不超过200位的非负整数可能有多余的前导0。输出一行即相加后的结果。结果里不能有多余的前导0即如果结果是342那么就不能输出为0342。有一说一我本人是不大想讲的因为这个题考的就是你们的思路算是oj上的第一大难点吧事实上就是我懒讲解一遍太费力了。但是我看很多同学都卡死在这道题一筹莫展我就感到十分的悲痛宝贵的刷题时光就这样浪费了多可惜。所以我写了这篇文章给那些想了很久但是真的没什么思路的同学那些没想过的最好别看因为这只是我的思路说不定你能想到更好的这篇文章只是帮助这些同学用我自认为比较“笨”方法来做出这道题来拓展一下他们局限的思路废话不多说了我们正式开始。难点1本题之所以难就难在他给的数据太大了远远超出了int 甚至long long的范围仅限于cpython和java没有这方面的问题所以第一步我们要知道如何输入数据我是是用字符串的方式进行输入的为什么用字符串不用数组呢因为字符串输入很方便直接一个%s这一行的数据都可以直接输入了也可以用gets我本人喜欢用gets我们可以很轻易的定义一个长度很大的字符串这样就可以确保我们的数据都可以输入进去。这个不是完整代码只是讲输入的代码。我定义了一个长度为201的字符串题目要求不超过长度200#includestdio.h #includestring.h int main(){ char x[201]; char y[201]; gets(x); gets(y); int len1strlen(x),len2strlen(y); //用strlen函数来检测字符串长度 }这里我们要测量出我们输入数据的长度后面会讲解有什么用使用strlen()函数要在前面加个#includestring.h和math.h一个道理strlen的作用测量字符串的长度比如我输入一个“1000000”的字符串用strlen就可以测出它的长度为7。难点2我是用字符串的方式输入的但是计算时用字符串会很麻烦并且需要重新排序后才可以更方便的进行计算加法有进一。所以我就把字符串内的数据转化成int的形式重新转入数组中毕竟这章节要用数组所以转回去也比较好解释int a[201]{0}; //代表字符串x全部初始化为0 int b[201]{0}; //代表字符串y int c[201]{0}; //这是我定义输出的数组c int len201; //因为我定义的数组大小为201所以我这里定义一个长度为201的变量len for(int i0;ilen1;i){ a[len-len1]x[i]-0; //这里具体解释往下看flag1 len; } len201; for(int i0;ilen2;i){ b[len-len2]y[i]-0; len; }这里写了个伪代码来把字符串的数据代入数flag1这里讲解一下为什么我设一个len200。我的想法是从后往前排也就是我们平时见到数字排序的方法这样的话比较直观好理解所以我是这样一个个数字排进去的从最大位到最小位见下表格假设我们输入一个1890在数组中就是这样数组序号193194195196197198199200201输入数据00001890最后一位空着这样在之后的计算中我们用同位的数组相加就行了逢10进一这就是我们下一步该干的事这一步比较简单我直接放出来了if(len1len2){ //这里我把它分成了两种情况等于的情况放在哪里都是可以的 for(int i200;i200-len1;i--){ //分成两种情况的好处是可以知道最大的数据的长度循环到比最大位多一位就行了加法只能进一位 c[i]a[i]b[i]; //我们把数组ab的值放入数组c中 if(c[i]10){ //逢10进一 c[i]-10; c[i-1]1; } } int flag0; //这里定义一个flag方便之后的前面的清零保证不会输出012这种情况 for(int i0;i200;i){ if(flag0c[i]!0){ //们从最初位往后排,直到不为0的最大项我们就可以改变flag让他之后包括本身的数据都能输出 flag1; } if(flag1){ printf(%d,c[i]); } } } else{ for(int i200;i200-len2;i--){ //同上只是数据最长值换了一下 c[i]a[i]b[i]; if(c[i]10){ c[i]-10; c[i-1]1; } } int flag0; for(int i0;i200;i){ if(flag0c[i]!0){ flag1; } if(flag1){ printf(%d,c[i]); } } }以上就是我个人大整数加法的做法了比较憨憨希望大家能够理解吧。下面把完整的代码发出来如果你认为对你有用的话不妨点个赞#includestdio.h #includestring.h int main(){ char x[201]; char y[201]; int a[201]{0}; int b[201]{0}; int c[201]{0}; gets(x); gets(y); int len1strlen(x),len2strlen(y); int len201; for(int i0;ilen1;i){ a[len-len1]x[i]-0; len; } len201; for(int i0;ilen2;i){ b[len-len2]y[i]-0; len; } if(len11len21){ if(a[200]0b[200]0){ printf(0); return 0; } } if(len1len2){ for(int i200;i200-len1;i--){ c[i]a[i]b[i]; if(c[i]10){ c[i]-10; c[i-1]1; } } int flag0; for(int i0;i200;i){ if(flag0c[i]!0){ flag1; } if(flag1){ printf(%d,c[i]); } } } else{ for(int i200;i200-len2;i--){ c[i]a[i]b[i]; if(c[i]10){ c[i]-10; c[i-1]1; } } int flag0; for(int i0;i200;i){ if(flag0c[i]!0){ flag1; } if(flag1){ printf(%d,c[i]); } } } return 0; }