大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求。可以使用字符串来表示大数,模拟大数相加的过程。
思路:1.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;
? ? ? ? ? ? 2.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;
? ? ? ? ? ? 3.把两个正整数相加,一位一位的加并加上进位。
具体代码如下:
- ?
- ?
- *?暂时不考虑负数,不考虑输入不合法的情况?
- *?要保证输入是正确的才能保证程序正常运行?
- */??
- ??
- #include?<stdio.h>??
- #include?<string.h>??
- ??
- #define?MAXSIZE?1000??
- int?main()??
- {??
- ????char?number1[MAXSIZE+1];??
- ????char?number2[MAXSIZE+1];??
- char?sum[MAXSIZE+2];??
- char?temp1[MAXSIZE+1];??
- char?temp2[MAXSIZE+1];??
- int?len1?=?0;??
- int?len2?=?0;??
- int?i?=?0;??
- int?j?=?0;??
- int?maxLen?=?0;??
- int?nSum?=?0;??
- int?nCarryBit?=?0;??
- int?nOverFlow?=?0;??
- ????gets(number1);??
- ????gets(number2);??
- ??????
- ????len1?=?strlen(number1);??
- ????len2?=?strlen(number2);??
- ????j?=?0;??
- ????for(i?=?len1-1;?i?>=?0;?--i)??
- ????{??
- ????????temp1[j++]?=?number1[i];??
- ????}??
- ????temp1[j]?=?' ';??
- ????for(i?=?len2-1;?i?>=?0;?--i)??
- ????????temp2[j++]?=?number2[i];??
- //2.把两个字符串补齐,即短字符串的高位用‘0’补齐??
- ????maxLen?=?(len1?>?len2)?len1:len2;??
- ????if(len1?<?len2)??
- ????{??
- ????????for(i?=?len1;?i?<?len2;?++i)??
- ????????????temp1[i]?=?'0';??
- ????????temp1[len2]?=?' ';??
- ????}??
- ????else?if(len1?>?len2)??
- ????????for(i?=?len2;?i?<?len1;?++i)??
- ????????????temp2[i]?=?'0';??
- ????????temp2[len1]?=?' ';??
- ??????
- ????for(i?=?0;?i?<?maxLen;?i++)??
- ????????nSum?=?temp1[i]?-?'0'?+?temp2[i]?-?'0'?+?nCarryBit;??
- ????????if(nSum?>?9)??
- ????????{??
- ????????????if(i?==?(maxLen-1))??
- ????????????{??
- ????????????????nOverFlow?=?1;??
- ????????????}??
- ??????????????
- ????????????nCarryBit?=?1;??
- ????????????sum[i]?=?nSum?-?10?+?'0';??
- ????????}??
- ????????else??
- ????????{??
- ????????????nCarryBit?=?0;??
- ????????????sum[i]?=?nSum?+?'0';??
- ????????}??
- //如果溢出的话表示位增加了??
- ????if(nOverFlow?==?1)??
- ????????sum[maxLen++]?=?nCarryBit?+?'0';??
- ????sum[maxLen]?=?' ';??
- //从后向前输出,即是相加后的值??
- ????for(i?=?maxLen-1;?i?>=0;?--i)??
- ????????putchar(sum[i]);??
- ????printf("n");??
- ????return?0;??
- }??
运行结果:
