zoukankan      html  css  js  c++  java
  • 大数加法 (A + B Problem II)

    现在的题目,感觉大数加法用的还是很少了,但还是在这里介绍一道最基础的题目。
    题目:hdu 1002 (http://acm.hdu.edu.cn/showproblem.php?pid=1002)
    解法:大数加法
    注意:需要注意的是,应该与大数乘法连起来一起看,你会发现它们之间进位的关系,加法最多只会进位1,但是乘法就会进位大于1。这是它们之间的区别
    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    #define MAX 1000
     
    char a[MAX+1],b[MAX+1];
    int T;
     
    int main()
    {
        scanf("%d",&T);
        for(int w=1;w<=T;++w)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            scanf("%s%s",a,b);
            printf("Case %d:
    ",w);
            printf("%s + %s = ",a,b);
            int len1=strlen(a);
            int len2=strlen(b);
            int fpla=MAX-( len1>len2 ? len1:len2);
            for(int i=len1-1,k=MAX;i>=0;--i,--k) 
                a[k]=(a[i]-'0'),a[i]=0;
                 
            for(int i=len2-1,k=MAX;i>=0;--i,--k) 
                b[k]=(b[i]-'0'),b[i]=0;
                 
            for(int i=MAX;i>=fpla;--i)
                a[i]+=b[i]; 
            for(int i=MAX;i>=fpla;--i)
            {
                int c=a[i]/10;
                a[i-1]+=c;
                a[i]%=10;
            } 
            for(int i=fpla+1;i<=MAX;++i)
                printf("%d",a[i]);
            puts("");
            if(w<T)
                puts("");
        }
        return 0;
    }

    纯净版的无添加原生代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        ios::sync_with_stdio(false);
        //freopen("in.txt","r",stdin);
        char s1[1000]; char s2[1000];
        int a[1000] = {0}; int b[1000] = {0}; int sum[1000] = {0};
        cin >> s1 >> s2;
        int lenA = strlen(s1) - 1;
        int lenB = strlen(s2) - 1;
        int k = 0;
        int maxx = max(lenA,lenB);
    
        for(int i=lenA;i>=0;i--)  //两个for循环,将数组的高低位置反
            a[k++] = s1[i] - '0';
        k = 0;
        for(int i=lenB;i>=0;i--)
            b[k++] = s2[i] - '0';
    
        int carry = 0;            //carry表示进位标识符
        for(int i=0;i<=maxx;i++)
        {
            int tmp1 = a[i] + b[i] +carry;
            sum[i] = tmp1%10;
            if(tmp1 >=10)        //如果相加大于10,表示有进位
                carry = 1;
            else
                carry = 0;
        }
        if(carry == 1) printf("1");    //如果最后,A,B的最高为相加有进位的话,那么可以单独输出
        for(int i=maxx;i>=0;i--)
            printf("%d",sum[i]);
        return 0;
    }
  • 相关阅读:
    on() 和 click() 的区别
    net core swagger
    sgen.exe 未能运行
    SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
    net core 实现简单爬虫—抓取博客园的博文列表
    javascript基础 方法
    android通过httpClient请求获取JSON数据并且解析
    发布到IIS的时候用户 'WWW-6743CC520E9ASPNET' 登录失败
    WebServices生成发布过程及常见问题的解决方法
    Android、iPhone和Java三个平台一致的加密工具
  • 原文地址:https://www.cnblogs.com/myxdashuaige/p/9438652.html
Copyright © 2011-2022 走看看