来源
高精度算法加,减,乘,除.
目前不能利用这个结构体更好的做出高精度除以高精度,对于进位再减法,没有好的想法。
#include <bits/stdc++.h>
using namespace std;
struct highnum {
long long num[10010]={0};
int len=0;
string s = "";
};
//打印开头
void printstart() {
printf(" |----------------------------|\n ");
printf(" |****************************|\n ");
printf(" |-------处理高精度数值-------|\n ");
printf(" |****************************|\n ");
printf(" | 0.退出系统 |\n ");
printf(" | 1.高精度加法 |\n ");
printf(" | 2.高精度减法 |\n ");
printf(" | 3.高精度乘法 |\n ");
printf(" | 4.高精度除法(低精度)|\n ");
printf(" | |\n ");
printf(" | |\n ");
printf(" | 先输入两个高精度数值 |\n ");
printf(" | 再输入要进行的计算 |\n ");
printf(" | |\n ");
printf(" | |\n ");
printf(" |----------------------------|");
printf("\n");
}
//字符串转换成数字
highnum arrangeint(string n) {
highnum ans;
for(int i=n.size()-1;i>=0;i--){
ans.num[++ans.len] = n[i] - '0';
}
return ans;
}
//判断高精度数值大小
int cmp(highnum n,highnum m) {
if(n.len > m.len) {
return 1;
}
else if (n.num < m.num) {
return -1;
}
else {
for(int i=1;i<n.len;i++) {
if(n.num[i] > m.num[i]){
return 1;
}
else if(n.num[i] < m.num[i]){
return -1;
}
}
return 0;
}
}
//处理前导0
highnum dealzero(highnum n) {
while(n.num[n.len] == 0 && n.len>1) {
n.len--;
}
return n;
}
//打印高精度结果
void println(highnum n){
cout<<n.s;
for(int i=n.len;i>=1;i--){
cout<<n.num[i];
}
cout<<"\n";
}
//高精度求和
highnum add(highnum n, highnum m) {
highnum ans;
ans.len = max(n.len,m.len);
for(int i=1;i<=ans.len;i++){
ans.num[i] += n.num[i] + m.num[i];
ans.num[i+1] += ans.num[i]/10; //对于一些数字结果进位
ans.num[i] = ans.num[i]%10; //位置上的值
}
if(ans.num[ans.len+1]>0){
ans.len++;
}
return ans;
}
//高精度求减法
highnum subtract(highnum n, highnum m) {
highnum ans;
if(cmp(n,m) == -1){
swap(n,m);
ans.s = "-";
}
ans.len = n.len;
for(int i=1;i<=ans.len;i++){
ans.num[i] += n.num[i] - m.num[i];
if(ans.num[i] < 0){ //如果小于0,需要进行借位
ans.num[i+1]-=1;
ans.num[i]+=10;
}
}
ans = dealzero(ans);
return ans;
}
//高精度乘法
highnum multiply(highnum n, highnum m) {
highnum ans;
ans.len = n.len + m.len - 1;
for(int i=1;i<=n.len;i++){
for(int j=1;j<=m.len;j++) { //这个对于m为小数可以看成大小反转的乘法
ans.num[i+j-1] += n.num[i] * m.num[j]; // i*j的位置乘法位置为i+j-1
ans.num[i+j] += ans.num[i+j-1]/10;
ans.num[i+j-1] = ans.num[i+j-1]%10;
}
}
if(ans.num[ans.len+1]>0){
ans.len++;
}
return ans;
}
//高精度除低精度
highnum divide1(highnum n, long long m) {
highnum ans;
ans.len = n.len;
for(int i=ans.len;i>=1;i--){ //需要从高位开始处以
ans.num[i] = n.num[i]/m;
n.num[i-1] += n.num[i]%m*10;
}
ans = dealzero(ans);
return ans;
}
int main(){
printstart();
string a,b;
cin>>a>>b;
long long c;
highnum n1 = arrangeint(a);
highnum n2 = arrangeint(b);
int choose;
cin>>choose;
switch(choose) {
case 1:
println(add(n1, n2));
break;
case 2:
println(subtract(n1, n2));
break;
case 3:
println(multiply(n1, n2));
break;
case 4:
printf("请输入低精度数值:\n");
cin>>c;
println(divide1(n1,c));
break;
/*
case 5:
println(divide2(n1,n2));
break;
*/
case 0:
exit(0);
}
}