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

    http://acm.hdu.edu.cn/showproblem.php?pid=1002

    #include<stdio.h>
    #include<string.h>
    
    // 预处理数值,去除前导0
    void prefix(char num[])
    {
        if (num[0] != '0')  //没有前导0,不用处理
        {
            return;
        }
        char *p = num;
        for (; *p == '0' && *p != 0; p++);  //使p移位指向第一个不为0的数位上
        if (*p == 0)
        {
            num[0] = '0';
            num[1] = 0;
        }
        else
        {
            num[0] = *p;
            for (char *q = num; *p != 0; *(++q) = *(++p));
        }
    }
    
    int main(int argc,char *argv[])
    {
        int flag=0;
        char a[1001],b[1001];   //数字存储器
        int ans[1001]={0};      //和存储器
        int n=0;                //迭代次数
        
        //获取变量
        scanf("%d",&n);
        
        //迭代
        for(int p=1;p<=n;p++)
        {
            flag++;
            //读取两个数
            scanf("%s%s",a,b);
            
            //前导0的去除
            prefix(a);
            prefix(b);
            
            //获取两个字符串的长度
            int lena=strlen(a);
            int lenb=strlen(b);
            
            //使pa存储长度更大的字符串
            char *pa,*pb;
            if(lena<lenb)
            {
                lena+=lenb;
                lenb=lena-lenb;
                lena-=lenb;
                //交换lena与lenb的目的是使pa指向的数长度更长
                pa=b;
                pb=a;
            } 
            else
            {
                pa=a;
                pb=b;
            }
            
            //计算开始
            int upa=0;//进位器
            int r=0;//存储数据数组的枚举
            for(int i=lena,j=lenb;i>0;)
            {
                //获取两个数当前的位数
                int na=pa[--i]-'0';
                int nb=j>0 ? pb[--j]-'0' : 0;   //pb指向的数位更短,以此计算时可能位数不够则为0
                
                //得到当前位的和
                int sum=na+nb+upa;
                
                //获得进位,比如9+8=17>10,则视为相应位为7,前一位进1
                upa=sum/10;
                
                //存储当前位
                ans[r++]=sum%10; 
            }
            
            //检测最后一位是否存在进位
            if(upa>0)
            {
                 ans[r++]=upa;
            }
            
            //输出Case #:
            printf("Case %d:
    ",flag);
            
            //输出a + b =
             printf("%s + %s = ",a,b);
             
             //输出结果
             while(r>0)
            {
                
                printf("%d",ans[--r]);
            } 
            
            //换行
            if(p!=n)
            {
                printf("
    
    ");
            }
            else
            {
                 printf("
    ");
            }
        } 
        return 0;
    }
  • 相关阅读:
    Linux从入门到入门到入门(一)
    计算机网络学习笔记
    计算机网络学习笔记
    c语言数据结构学习心得——排序
    c语言数据结构学习心得——查找
    adb 命令小结
    软件测试之面试题分享
    关于app启动时间测试的小思考
    软件缺陷
    黑盒测试,白盒测试
  • 原文地址:https://www.cnblogs.com/friend-A/p/8933645.html
Copyright © 2011-2022 走看看