uacs2024

导航

高精度 未解决

洛谷P1601 A+B Problem(高精)

输入格式

分两行输入。a , b <= 10^500

#include <iostream>
using namespace std;
#include <string>

const int N = 501;
int num1[N],num2[N],res[N];
int p,q;

int main() {
    string s1,s2;
    cin >> s1 >> s2;
    int size1 = s1.size(),size2 = s2.size();
    //按照人类理解的方式存储两个数,低位放低位,高位放高位
    for(int i = size1-1;i >= 0;i--)  num1[p++] = s1[i]-'0';
    for(int i = size2-1;i >= 0;i--)  num2[q++] = s2[i]-'0';

    p = p > q ? p : q;  //将两个数中更大的位数记为p,其实就是max(size1,size2)
    int t = 0;
    for(int i = 0; i < p; i++){
        t = t + num1[i] + num2[i];
        res[i] = t % 10;
        t /= 10;
    }
    if(t > 0){
        res[p] = 1;cout << "1";
    }
    for(int i = p - 1;i >= 0;i--)  cout << res[i];
}

 

洛谷P2142 高精度减法

输入格式

两个整数 a,b(第二个可能比第一个大)。 0 < a , b <= 10^10086

输出格式

结果(是负数要输出负号)。

#include <iostream>
using namespace std;
#include <string>
#include <algorithm>

const int N = 10087;
int num1[N],num2[N],res[N];
int p,q;

int main() {
    string s1,s2;
    cin >> s1 >> s2;
    if(s1 == s2){
        cout << "0";return 0;  //如果不加这个判断,那么将会什么也不输出
    }
    int size1 = s1.size(),size2 = s2.size();
    //只有位数相等的情况下的直接比大小才是人类所理解的两个数比大小
    if(size1 < size2 || (size1 == size2 && s1 < s2)){
        swap(s1,s2);swap(size1,size2);
        cout << "-";
    }

    for(int i = size1-1;i >= 0;i--)  num1[p++] = s1[i]-'0';
    for(int i = size2-1;i >= 0;i--)  num2[q++] = s2[i]-'0';

    p = p > q ? p : q;

    for(int i = 0; i < p; i++){
        if(num1[i] >= num2[i])  res[i] = num1[i] - num2[i];
        else{
            res[i] = num1[i] - num2[i] + 10;num1[i+1]--;
        }
    }

    while(res[p-1] == 0) p--;//防止结果前面打印了很多个0
    for(int i = p - 1;i >= 0;i--)  cout << res[i];
}

 

洛谷P1303 A*B Problem

题目描述

给出两个非负整数,求它们的乘积。

输入格式

输入共两行,每行一个非负整数。每个非负整数不超过 10^2000

输出格式

输出一个非负整数表示乘积。

#include <iostream>
using namespace std;
#include <string>
#include <algorithm>

const int N = 2001;
int num1[N],num2[N],res[N*2];
int p,q;

int main() {
    string s1,s2;
    cin >> s1 >> s2;
    if(s1 == "0" || s2 == "0"){
        cout << "0";return 0;
    }
    
    int size1 = s1.size(),size2 = s2.size();
    if(size1 < size2){
        swap(s1,s2);swap(size1,size2);//保证两个数的位数相同,或者第一个数a比第二个数b的位数要多
    }
    
    for(int i = size1-1;i >= 0;i--)  num1[p++] = s1[i]-'0';
    for(int i = size2-1;i >= 0;i--)  num2[q++] = s2[i]-'0';

    for(int i = 0; i < size2; i++){
        int t = 0;//t代表进多少位
        int j;  //j代表第二个数b的各个位的乘法
        for(j = 0;j < size1;j++){
            t = num1[j] * num2[i] + t;
            res[j + i] = res[j + i] + t % 10;
            if(res[j + i] >= 10){
                res[j + i] -= 10;res[j + i + 1]++;
            }
            t /= 10;
        }
        res[j + i] = res[j + i] + t;
    }
    
    if(res[size1+size2-1] != 0)  cout << res[size1+size2-1];
    for(int i = size1 + size2 - 2; i >= 0;i--)  cout << res[i];
}

 

posted on 2024-11-19 13:49  ᶜʸᵃⁿ  阅读(2)  评论(0编辑  收藏  举报