登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

9.7 大数相加

分享到:

本文已被浏览1824

由于不管是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的图.

AC图
 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

 您需要 先登录 才可以回复.