高精度算法

来源
高精度算法加,减,乘,除.
目前不能利用这个结构体更好的做出高精度除以高精度,对于进位再减法,没有好的想法。

#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);
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值