zoukankan      html  css  js  c++  java
  • 高精度整数

    题目描述:

    实现一个加法器,使其能够输出a+b的值。

    输入:

    输入包括两个数a和b,其中a和b的位数不超过1000位。

    输出:

    可能有多组测试数据,对于每组数据,输出a+b的值

    样例输入:

    2 6

    1000000000000000000000 10000000000000000000000000000000000000000000

    样例输出:

    8

    100000000000000000000000000000000000000000000

    #include <iostream>
    #include<string.h>
    #include<cstdio>
    using namespace std;
    
    struct bigInteger{
        int digit[1000];//按四位数一个单位保存数值
        int size;//下一个我们未使用的数组单元
    
        void init(){//初始化
            for(int i=0;i<1000;i++)
                digit[i] = 0;
            size = 0;
        }
    
        void set(char str[]){//从字符串中提取整数
            init();
            int L = strlen(str);//计算字符串长度
            for(int i=L-1,j=0,t=0,c=1;i>=0;i--){
                    /**从最后一个字符开始倒序遍历字符串,
                    j控制每4个字符转换成一个数字存入数组,
                    t临时保存字符转换位数字的中间值,
                    c表示当前位的权重,按1,10,100,1000顺序变化
                    */
                t += (str[i]-'0')*c;//计算这个四位数中当前字符代表的数字,即数字乘以当前位权重
                j++;//当前转换字符数增加
                c *= 10;//计算下一位权重
                if(j == 4 || i == 0){//若已经连续转换四个字符,或者已经达到最后一个字符
                    digit[size++] = t;//这四个字符代表的四位数存入数组,size移动到下一个数组单元
                    j=0;
                    t=0;
                    c=1;
                }
            }
        }
    
        void output(){//将该高精度整数输出
        for(int i=size-1;i>=0;i--){
            if(i!=size-1)
                printf("%04d",digit[i]);//即当前输出的数字不是最高位数字,用%04的输出前导0,即当前数字不足4位时由0补充
            else
                printf("%d",digit[i]);//若是最高位,则无需输出前导0
        }
            printf("
    ");
        }
    
        bigInteger operator + (const bigInteger &A) const {//加法运算符
            bigInteger ret;//返回两数相加的结果
            ret.init();
            int carry = 0;//进位,初始值为0
            for(int i=0;i<A.size || i<size;i++){
                int temp = A.digit[i]+digit[i]+carry;//计算两个整数当前位以及来自低位的进位和
                carry = temp/10000;//计算该位的进位
                temp %= 10000;//去除进位部分,取后四位
                ret.digit[ret.size++] = temp;//保存该位结果
            }
            if(carry != 0){//计算结束后若最高位有进位
                ret.digit[ret.size++]=carry;//保存该进位
            }
            return ret;
        }
    }a,b,c;
    
    char str1[1002],str2[1002];
    int main()
    {
        scanf("%s %s",str1,str2);
        a.set(str1);//两个字符串分别设置两个高精度整数
        b.set(str2);
        c = a+b;
        c.output();//输出
        return 0;
    }

    对于c和c++,要使用结构体保存一个高精度整数:

    struct bigInteger{
        int digit[1000];//按四位数一个单位保存数值
        int size;//下一个我们未使用的数组单元
    };
  • 相关阅读:
    53分(我的所有)请教:关于ClientDataSet新增记录问题(请富翁们关注!谢谢)
    DBGrid显示行号的几种方法
    现在序号加上,但怎么控制这一列不能拖动,换句话说不能获取焦点?
    Delphi
    巧妙修复delphi文件关联
    cxGrid中有没有办法操作单个cell是否只读?
    delphi cxgrid 使用方法
    Delphi XE2 的控件安装方法。
    舟山牙医 君子慎独 让你的DBGrid竖着站
    DELPHI程序的自动升级功能的实现(AUTOUPDATE使用指南)
  • 原文地址:https://www.cnblogs.com/xym4869/p/8579180.html
Copyright © 2011-2022 走看看