• 计蒜客 —— 大整数加法


    大整数加法

    求两个不超过 200 位的非负整数的和。

    输入格式

    有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0

    输出格式

    一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342

    输出时每行末尾的多余空格,不影响答案正确性

    样例输入

    22222222222222222222
    33333333333333333333

    样例输出

    55555555555555555555

    坑点:

    • 模拟各位相加及进位的逻辑
    • 前导 0 ,最后几个测试数据有好几位前导 0 ,这些 0 都不能输出,最后一组测试数据则全都是 0 。。。 只能输出最后一个 0 

    坑死了。。。

    #include<stdio.h>
    
    int a[201];
    int b[201];
    int c[300];
    
    int main(){
        int i = 0;
        char cc;
        while( (cc = getchar() )!= '
    ' ){
            a[i] = cc - 48;
            i++;
        }
        int j = 0;
        while( (cc = getchar() )!= '
    '  ){
            b[j] = cc - 48;
            j++;
        }
        // 上方是两个大整数的输入过程
        int x = 0;
        i--;
        j--;
        int jw = 0;
        // 模拟加法运算及进位逻辑
        while(i >= 0 && j >= 0){
            int u = a[i] + b[j] + jw;
            jw = 0;
            if( u >= 10){
                c[x] = u % 10;
                jw = u /10;
                x++;
                i--;
                j--;
            }else{
                c[x] = u;
                jw = 0;
                j--;
                i--;
                x++;
            }
        }
        // 两个大整数有一个大整数的所有位已经参与运算,判断是哪个大整数还有数位剩余
        if(i == -1 && j != -1){
            while(j != -1){
                int pp = jw + b[j];
                jw = 0;
                if(pp >= 10){
                    c[x] = pp % 10;
                    jw = pp /10;
                    x++;
                }else{
                    c[x] = pp;
                    x++;
                }
                j--;
            }
    
    
        }
        if(i != -1 && j == -1){
            while(i != -1){
                int pp = jw + a[i];
                jw = 0;
                if(pp >= 10){
                    c[x] = pp % 10;
                    jw = pp /10;
                    x++;
                }else{
                    c[x] = pp;
                    x++;
                }
                i--;
            }
        }
        if(i == -1 && j == -1){
            if(jw != 0){
                c[x] = jw;
                x++;
            }
        }
        x--;
        int flag = 1;
        // 解释见上方的  坑点
        for(int r = x;r > 0;r--){
            if(c[r] == 0 && flag == 1)
                continue;
            else
            {
                printf("%d",c[r]);
                flag = 0;
            }
        }
        printf("%d",c[0]);
        return 0;
    }
  • 相关阅读:
    进程、线程、轻量级进程、协程与 go 的 goroutine
    Base: 一种 Acid 的替代方案
    单点登录 SSO(Single Sign-On)的实现原理
    大型网站之分布式会话管理
    PayPal 高级工程总监:读完这 100 篇文献,就能成大数据高手
    主流编程语言的 33 款开源爬虫
    docker基础命令
    mysql实现首字母从A-Z排序
    solr+zookeeper集群配置
    Lucene与Solr基础
  • 原文地址:https://www.cnblogs.com/expedition/p/11629793.html
Copyright © 2020-2023  润新知