zoukankan      html  css  js  c++  java
  • 【字符串】【AOJ-437】高精度加法

    Description
    计算一组连续的非负整数的和
    Input
    第一行T,表示测试数据有T组
    第2至K+1行:每行一个非负整数,位数在100以内,每组长整数不超过50个,每组输入以"0"结束
    Output
    每组对应一个输出,为该组数的和
    Sample Input
    1
    123456789012345678901234567890
    123456789012345678901234567890
    123456789012345678901234567890
    0
    

     
    Sample Output
    370370367037037036703703703670
    
     
    Hint
    整数可能以0开始
     
    思路:
    高精度加法就是模拟手算,用字符串逆序储存数字,每位相加,>=10进一位和下一位相加,要注意这题可能以0开始,即010+010 000+010等都有可能,注意处理前导0
     
    参考代码:
     
    #include <stdio.h>
    #include <string.h>
    char a[55][110]={0};
    void add(char *a,char *b);//高精度加法
    void change(char *a);//字符串倒序
    void del(char *a,int n);//删除前导0
    int main()
    {
        int t,k=0,i,len,flag,m;
        scanf("%d",&t);
        while(t--)
        {
            k=0;
            
            while(scanf("%s",a[k]))
            {
                flag=0;
                m=strlen(a[k]);
                if(a[k][0]=='0'&&m==1)
                    break;
                if(a[k][0]=='0')
                {
                    for(i=0;i<m;i++)
                    {
                        if(a[k][i]=='0')
                            flag++;
                        if(a[k][i]!='0')
                            break;
                    }
                    del(a[k],flag);
                }
                change(a[k]);
                k++;
            }
            for(i=0;i<k;i++)
                add(a[i],a[i+1]);
            len=strlen(a[i]);
            for(k=len-1;k>=0;k--)
                printf("%c",a[i][k]);
            printf("
    ");
        }
        return 0;
    }
    void add(char *a,char *b)
    {
        int lena,lenb,i,num,e=0;
        char p[110]={0};
        lena=strlen(a);
        lenb=strlen(b);
        if(lena>lenb)
        {
            for(i=0;i<lenb;i++)
            {
                num=a[i]-'0'+b[i]-'0'+e;
                e=num/10;
                p[i]=num%10+'0';
            }
            for(;i<lena;i++)
            {
                num=a[i]-'0'+e;
                e=num/10;
                p[i]=num%10+'0';
            }
            if(e)
                p[i++]=e+'0';
            p[i]=0;
        }
        else
        {
            for(i=0;i<lena;i++)
            {
                num=a[i]-'0'+b[i]-'0'+e;
                e=num/10;
                p[i]=num%10+'0';
            }
            for(;i<lenb;i++)
            {
                num=b[i]-'0'+e;
                e=num/10;
                p[i]=num%10+'0';
            }
            if(e)
                p[i++]=e+'0';
            p[i]=0;
        }
        strcpy(b,p);
    }
    
    
    void change(char *a)
    {
        int i,len;
        char temp;
        len=strlen(a);
        for(i=0;i<len/2;i++)
        {
            temp=a[i];
            a[i]=a[len-1-i];
            a[len-1-i]=temp;
        }
    }
    
    void del(char *a,int n)
    {
        int i,len;
        len=strlen(a);
        for(i=0;i<len-n;i++)
            a[i]=a[i+n];
        a[i]='';
    }
  • 相关阅读:
    Mbs Framework 简介
    回应老赵: 适合C# Actor的消息执行方式 中看也中用的解决方案
    Mini 容器学习笔记5—— 组件的获取
    JS控制文本框只能输入N个字符.
    【转】外挂编写原理
    【转】集合小节
    CSS样式的filter(滤镜效果)
    系统变量(%SystemRoot% ,%windir% ,%temp%,%system%)的表示方法
    客户端调用服务器控件
    Flash MX 认证考试(样题)
  • 原文地址:https://www.cnblogs.com/ahu-shu/p/3482284.html
Copyright © 2011-2022 走看看