第十六天(2):高精度整数+高精度乘法+高精度进制转换


T1

a + b
时间限制:1 秒
内存限制:32 兆
特殊判题:否

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

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

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

样例输入:
2 6
10000000000000000000 10000000000000000000000000000000

样例输出:
8
10000000000010000000000000000000


//
//  main.cpp
//  biga_bplus
//
//  Created by Apple on 2019/8/20.
//  Copyright © 2019 Apple_Lance. All rights reserved.
//

#include <iostream>
#include <string.h>
#include <stdio.h>
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--){
            t += (str[i] - '0') * c;
            c *= 10;
            j++;
            if(j == 4 || i == 0){
                digit[size++] = t;
                t = 0;
                c = 1;
                j = 0;
            }
        }
    }
    
    void output(){
        for(int i = size - 1;i >= 0;i--){
            if(i != size - 1)
                printf("%04d", digit[i]);
            else
                printf("%d", digit[i]);
        }
        printf("\n");
    }
    
    bigInteger operator+(const bigInteger &A)const{
        bigInteger ret;
        ret.init();
        int carry = 0;
        for(int i = 0;i < A.size || i < size;i++){
            int tmp = A.digit[i] + digit[i] + carry;
            carry = tmp / 10000;
            tmp %= 10000;
            ret.digit[ret.size++] = tmp;
        }
        if(carry != 0)
            ret.digit[ret.size++] = carry;
        return ret;
    }
}a, b, c;

char str1[1000], str2[1000];
int main(int argc, const char * argv[]) {
    while(scanf("%s%s", str1, str2) != EOF){
        a.set(str1);
        b.set(str2);
        c = a + b;
        c.output();
    }
    return 0;
}

T2

N 的阶层
时间限制:3 秒
内存限制:128 兆
特殊判题:否

题目描述 输入一个正整数 N,输出 N 的阶乘。

输入: 正整数 N(0<=N<=1000)

输出: 输入可能包括多组数据,对于每一组输入数据,输出 N 的阶乘

样例输入:
4
5
15

样例输出:
24
120
1307674368000

//
//  main.cpp
//  Biga_bMultiple
//
//  Created by Apple on 2019/8/20.
//  Copyright © 2019 Apple_Lance. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
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(int x){
        init();
        do{
            digit[size ++] = x % 10000;
            x /= 10000;
        }while(x != 0);
    }
    
    void output(){
        for(int i = size - 1;i >= 0;i--){
            if(i != size - 1)
                printf("%04d", digit[i]);
            else
                printf("%d", digit[i]);
        }
        printf("\n");
    }
    
    bigInteger operator * (int x)const{
        bigInteger ret;
        ret.init();
        int carry = 0;
        for(int i = 0;i<size;i++){
            int tmp = x * digit[i] + carry;
            carry = tmp / 10000;
            tmp %= 10000;
            ret.digit[ret.size++] = tmp;
        }
        if(carry != 0)
            ret.digit[ret.size++] = carry;
        return ret;
    }
}a;

int main(int argc, const char * argv[]) {
    // insert code here...
    int n;
    while(scanf("%d", &n) != EOF){
        a.init();
        a.set(1);
        for(int i = 1;i <= n;i++)
            a = a * i;
        a.output();
    }
    return 0;
}

T3

进制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否 :

题目描述:将 M 进制的数 X 转换为 N 进制的数输出。

输入: 输入的第一行包括两个整数:M 和 N(2<=M,N<=36)。
下面的一行输入一个数 X,X 是 M 进制的数,现在要求你将 M 进制的数 X 转换成 N 进制的数输出。

输出: 输出 X 的 N 进制表示的数。

样例输入:
16 10
F

样例输出:
15

提示: 输入时字母部分为大写,输出时为小写,并且有大数据。

//
//  main.cpp
//  BigBinaryConversion
//
//  Created by Apple on 2019/8/20.
//  Copyright © 2019 Apple_Lance. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace  std;

#define maxDigits 100

struct bigInteger{
    int digit[maxDigits];
    int size;
    
    void init(){
        for(int i = 0;i<maxDigits;i++)
            digit[i] = 0;
        size = 0;
    }
    
    void set(int x){
        init();
        do{
            digit[size++] = x % 10000;
            x /= 10000;
        }while(x != 0);
    }
    
    void output(){
        for(int i = size - 1;i >= 0;i--){
            if(i != size - 1)
                printf("%04d", digit[i]);
            else
                printf("%d", digit[i]);
        }
        printf("\n");
    }
    
    bigInteger operator* (int x) const{
        bigInteger ret;
        ret.init();
        int carry = 0;
        for(int i = 0;i < size;i++){
            int tmp = digit[i]*x + carry;
            carry = tmp / 10000;
            tmp %= 10000;
            ret.digit[ret.size++] = tmp;
        }
        if(carry != 0)
            ret.digit[ret.size++] = carry;
        return ret;
    }
    
    bigInteger operator + (const bigInteger &A)const{
        bigInteger ret;
        ret.init();
        int carry = 0;
        for(int i = 0;i < size || i < A.size;i++){
            int tmp = digit[i] + A.digit[i] + carry;
            carry = tmp / 10000;
            tmp %= 10000;
            ret.digit[ret.size ++ ] = tmp;
        }
        if(carry != 0)
            ret.digit[ret.size ++] = carry;
        return ret;
    }
    
    bigInteger operator / (int x)const{
        bigInteger ret;
        ret.init();
        int remainder = 0;
        for(int i = size - 1;i >= 0;i--){
            int t = (remainder * 10000 + digit[i]) / x;
            int r = (remainder * 10000 + digit[i]) % x;
            ret.digit[i] = t;
            remainder = r;
        }
        ret.size = 0;
        for(int i = 0;i < maxDigits;i++)
            if(ret.digit[i] != 0)
                ret.size = i;
        ret.size ++;
        return ret;
    }
    
    int operator % (int x)const{
        int remainder = 0;
        for(int i = size - 1;i >= 0;i--)
            remainder = (remainder * 10000 + digit[i]) % x;
        return remainder;
    }
}a, b, c;

char str[10000];
char ans[10000];

int main(int argc, const char * argv[]) {
    int m, n;
    while(scanf("%d%d", &m, &n) != EOF){
        scanf("%s", str);
        int L = strlen(str);
        a.set(0);
        b.set(1);
        for(int i = L - 1;i >= 0;i--){
            int t;
            if(str[i] >= '0' && str[i] <= '9')
                t = str[i] - '0';
            else
                t = str[i] - 'A' + 10;
            a = a + b * t;
            b = b * m;
        }
        a.output();
        int size = 0;
        do{
            int t = a % n;
            if(t >= 10)
                ans[size++] = t - 10 + 'a';
            else
                ans[size++] = t + '0';
            a = a / n;
        }while(a.digit[0] != 0 || a.size != 1);
        for(int i = size - 1;i>=0;i--)
            printf("%c", ans[i]);
        printf("\n");
    }
    return 0;
}
发布了182 篇原创文章 · 获赞 101 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/lancecrazy/article/details/99821695