zoukankan      html  css  js  c++  java
  • 大数加法

    问题:我有一个非常简单的问题给你。给定两个整数A和B,你的工作是计算A + B的总和

    分析:不能定义两个整数去相加,当数太大后,数据就会溢出,比如:112233445566778899+998877665544332211。所以使用两个字符数组,将每一个数作为数组的一个元素存进去,然后再把两个字符数组相加存入一个结果的数组。

    困难:两个数组相加,会存在进位和溢出

    解决:将数组里面的元素倒过来然后相加,若进位了,设置一个判断是否进位的条件,若进位了acc=1,没进位acc=0,sum[i]=s1[i]-'0'+s2[i]-'0'+acc。

    代码:

    #include <stdio.h>
    #include<string.h>
    #include <stdlib.h>
    
    int main()
    {
        char s1[1000],s2[1000],sum[1001],s3[1000],s4[1000];
        int t,x;
        void reverse(char*s);
        void add(char*s1,char*s2,char*sum);
        scanf("%d",&t);
        x=1;
        while(t--)
        {
            s1[1000]='0';
            s2[1000]='0';
            scanf("%s %s",s1,s2);
            strcpy(s3,s1);
            strcpy(s4,s2);
            add(s1,s2,sum);
            if(t!=0)
                printf("Case %d:
    %s + %s = %s
    
    ",x,s3,s4,sum);
            else
                printf("Case %d:
    %s + %s = %s
    ",x,s3,s4,sum);
            x++;
        }
        return 0;
    }
    
    void reverse(char*s)
    {
        int length;
        int i=0;
        char temp;
        length=strlen(s);
        while(i<length-i-1)
        {
            temp=s[i];
            s[i]=s[length-i-1];
            s[length-i-1]=temp;
            i++;
        }
    }
    
    void add(char*s1,char*s2,char*sum)
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        int acc=0,temp,i;
        reverse(s1);
        reverse(s2);
        for(i=0;i<len1 && i<len2;i++)
        {
            temp=s1[i]-'0'+s2[i]-'0'+acc;
            sum[i]=temp%10+'0';
            if(temp>=10)
                acc=1;
            else
                acc=0;
        }
        if(i<len1)
        {
            for(;i<len1;i++)
            {
                temp=s1[i]-'0'+acc;
                sum[i]=temp%10+'0';
                if(temp>=10)
                    acc=1;
                else
                    acc=0;
            }
        }
        if(i<len2)
        {
            for(;i<len2;i++)
            {
                temp=s2[i]-'0'+acc;
                sum[i]=temp%10+'0';
                if(temp>=10)
                    acc=1;
                else
                    acc=0;
            }
        }
        if(acc==1)
            sum[i++]='1';
        sum[i]='';
        reverse(sum);
    
    }
  • 相关阅读:
    kvm
    docker及lvs负载
    zookeeper,及k8s基础概念
    zabbix-proxy及ELK
    gitlab及jenkins
    绘图 Matplotlib Numpy Pandas
    Elasticsearch
    Git命令小结
    win黑窗口命令
    Linux基础命令
  • 原文地址:https://www.cnblogs.com/805776844qqcom/p/7206643.html
Copyright © 2011-2022 走看看