zoukankan      html  css  js  c++  java
  • 3116 高精度练习之加法——http://codevs.cn/problem/3116/

    第一部分:题目

    题目描述 Description

    给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。

    输入描述 Input Description

    读入两个用空格隔开的正整数

    输出描述 Output Description

    输出A+B的值

    样例输入 Sample Input

    3 12

    样例输出 Sample Output

    15

    数据范围及提示 Data Size & Hint

    两个正整数的位数不超过500位

    第二部分:思路

    由于数值比较大,所以用字符串形式接收。因为相加是从个位开始,所以可以从数组最后开始(这样需要判断哪个数长,稍微麻烦点)或者先把数组倒置在进行计算。这里使用的是后者。当两个数的长度不一样时需要把长的那个继续计算。在相加的过程中,需要判断是否需要进位,这里的flag变量其实就起到这个作用。

    第三部分:代码

    #include<stdio.h>
    #include<string.h>
    void repai(char s[500],int len)//把数组倒置 
    {
        int i,j=len-1;
        char t;
        for(i=0;i<j;i++)
        {
            j=len-i-1;//相当于以中点对折。 
            t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
    }
    int main()
    {
        char a[500],b[500];//接收数a、b 
        int result[501],length=0,alen,blen;
        scanf("%s %s",a,b);
        alen=strlen(a);//数组a、b长度 
        blen=strlen(b);
        int i,j,flag=0;
        repai(a,alen);//倒置 
        repai(b,blen);
        int t;
        for(i=0;i<alen&&i<blen;i++)//从个位开始相加 
        {
            t=a[i]-'0'+b[i]-'0'+flag;
            if(t>9)//判断是否需要进位 
            {
                t-=10;
                flag=1;
            }
            else//这里稍微注意一下,当前不需要进位时置为0 
            {
                flag=0;
            }
            result[length++]=t;
        }
        while(i<alen)
        {
            t=a[i]-'0'+flag;
            if(t>9)
            {
                t-=10;
                flag=1;
            }
            else
            {
                flag=0;
            }
            result[length++]=t;
            i++;
        }
        while(i<blen)
        {
            t=b[i]-'0'+flag;
            if(t>9)
            {
                t-=10;
                flag=1;
            }
            else
            {
                flag=0;
            }
            result[length++]=t;
            i++;
        }
        if(flag)
        {
            result[length++]=1; 
        }
        for(i=length-1;i>=0;i--)
        {
            printf("%d",result[i]);
        }
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    九度OJ 1035:找出直系亲属(二叉树)
    while 循环的理解
    while 循环的理解
    count 变量的使用
    count 变量的使用
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    数据结构与算法的实现 —— 结点定义与数据结构的选择
    最小生成树(MST,minimum spanning tree)
    最小生成树(MST,minimum spanning tree)
    Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5379649.html
Copyright © 2011-2022 走看看