高精度 未解决
洛谷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];
}