9.7 大数相加
本文已被浏览853839次
由于不管是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的图.
评论
您需要 先登录 才可以回复.