9.7 大数相加
本文已被浏览853334次
由于不管是int类型抑或是double类型都是有范围的,但是总是有那么些数字,能够大的超过这个范围,那么这些数字应该怎样计算呢?这里提供了一个思路:
把这些大的变态的数字当做字符串存起来,然后通过最基本的竖式运算来解决.
那么,这个思路将会把很大位数的运算简化为20以内的计算,那么计算变成为了可能!
思路有了,转化为算法就是:
Step 0:Input 2 Number(Num1,Num2)
Step 1:依次取出Num1和Num2的各个数字进行加法运算并存入Add中相应的字符位置
Step 2:将取出的字符根据对应关系转化为正常的十进制数字
Step 3:将转化得到的数字加和存入数组,分别代表10^1,10^2……
Step 4:将各个数字能够进1的进一
Step 5:Output
编写为代码即为:
#include <stdio.h> #include <string.h> int main(){ //定义变量,虽然用不了1000位,但是要有远大的志向→_→ //... //好吧,我承认,我在浪费内存(⊙﹏⊙)b char Num1[1000]={0},Num2[1000]={0}; int i,j,k,Add[1001]={0}; //读取数据 scanf("%s",&Num1); scanf("%s",&Num2); //比较一下Num1和Num2哪一个更长一些(更长意味着更大....) if(strlen(Num1)<strlen(Num2)){ j=strlen(Num2)-1; i=strlen(Num1)-1; k=0; //开循环依次相加 for(;i>=0;i--,j--){ //0的ASCII为48,所以取得的字符的ASCII减去48就是这个数字 Add[k]=(int)Num2[j]+(int)Num1[i]-48*2; //千万不能忘记的k++否则只会对一个元素进行操作...... k++; } //添加剩余的元素(没有参与运算的高位数) for(;j>=0;j--){ Add[k]=(int)Num2[j]-48; k++; } }else{ //同上 j=strlen(Num2)-1; i=strlen(Num1)-1; k=0; for(;j>=0;i--,j--){ Add[k]=(int)Num2[j]+(int)Num1[i]-48*2; k++; } for(;i>=0;i--){ Add[k]=(int)Num1[i]-48; k++; } } /*这个操作相当于在竖式运算中 1 2 3 4 5 6 7 + 1 2 3 4 ---------------- 确定1234567(大数)在上而1234(小数)在下*/ //从最后一位开始依次向前扫描,够10的进一位 for(i=0;i<k;i++){ if(Add[i]>9){ Add[i]=Add[i]-10; Add[i+1]=Add[i+1]+1; } } //因为下标为k的那一个元素前边可能还有一位,所有为了补充加一个 //测试时发现类似于9999999999+1的运算会有Bug所以会搞这么一个 if(Add[k]!=0){ printf("%d",Add[k]); } //倒序输出Add,因为把最低位放在了前边...... for(i=k-1;i>=0;i--){ printf("%d",Add[i]); } //经常卡住不能通过的坑爹换行符 printf("n"); return 0; }
最后,贴一张AC的图.
评论
您需要 先登录 才可以回复.