基于类和对象的高精度算法封装

 2023-09-09 阅读 22 评论 0

摘要:hi 这是使用类和对象的高精度计算封装实现,这能够进行面向对象的高精度计算编程。 #include<iostream> #include<cstring> using namespace std;class BIGINT{public:int num[505];int length;bool positive;BIGINT(string str=""){memset(nu

hi

这是使用类和对象的高精度计算封装实现,这能够进行面向对象的高精度计算编程。

#include<iostream>
#include<cstring>
using namespace std;class BIGINT{public:int num[505];int length;bool positive;BIGINT(string str=""){memset(num, 0, sizeof(num));positive = true;if(str == ""){return;}else{length = str.length();for(int i = 0; i<str.length(); i++){num[i] = str[str.length()-i-1]-'0';}}}void show(){if(positive == false){cout<<"-";}for(int i = length-1; i>=0; i--){cout<<num[i];}}
};int compare(BIGINT &a,BIGINT &b){if(a.length > b.length){return 1;}else if(a.length < b.length){return -1;}else{int maxlen = max(a.length,b.length);for(int i = maxlen-1; i>=0; i--){if(a.num[i] > b.num[i]){return 1;}else if(a.num[i] < b.num[i]){return -1;}}return 0;}
}BIGINT bigadd(BIGINT &a,BIGINT &b){BIGINT c;int maxlen = max(a.length,b.length);//相加for(int i = 0;i<maxlen;i++){c.num[i] = a.num[i] + b.num[i];}//进位for(int i = 0;i<maxlen;i++){if(c.num[i]>=10){c.num[i+1] += 1;c.num[i] = c.num[i] % 10;}}//去零if(c.num[maxlen] == 0){c.length = maxlen;}else{c.length = maxlen + 1;}return c;
}BIGINT bigminus(BIGINT &a,BIGINT &b){BIGINT c;int maxlen = max(a.length,b.length);//判断int maxint = compare(a,b);if(maxint == 1){//相减for(int i = 0;i<a.length;i++){if(a.num[i]>=b.num[i]){c.num[i] = a.num[i] - b.num[i];}else{a.num[i+1] -= 1;a.num[i] += 10;c.num[i] = a.num[i] - b.num[i];}}}else if(maxint == -1){c = bigminus(b,a);c.positive = false;}//去零for(int i = maxlen+1;i>=0;i--){if(c.num[i] != 0){c.length = i+1;return c;}}c.length = 1;return c;
}BIGINT bigmultiply(BIGINT &a,BIGINT &b){BIGINT c;//相乘for(int i = 0;i<a.length;i++){ for(int j = 0;j<b.length;j++){   c.num[i+j] += a.num[i]*b.num[j];c.num[i+j+1] += c.num[i+j]/10;c.num[i+j] %= 10;}}//预估int len = a.length + b.length;//去零for(int i = len+1;i>=0;i--){if(c.num[i] != 0){c.length = i+1;return c;}}c.length = 1;return c; 
}BIGINT bigmultiplywithsmall(BIGINT a,int b){//相乘for(int i = 0;i<a.length;i++){a.num[i] *= b;}//进位for(int i = 0;i<a.length+1;i++){if(a.num[i]>=10){a.num[i+1] += a.num[i] / 10;a.num[i] %= 10;}}//去零if(a.num[a.length] != 0){a.length += 1;}return a;
}int main(){BIGINT a("111111111");BIGINT b("111111111");BIGINT tmp; tmp = bigadd(a,b);cout<<"高精度加法:";tmp.show();cout<<endl; tmp = bigminus(a,b);cout<<"高精度减法:";tmp.show();cout<<endl;tmp = bigmultiply(a,b);cout<<"高精度乘法:";tmp.show();cout<<endl;tmp = bigmultiplywithsmall(a,100);cout<<"高低精乘法:";tmp.show();cout<<endl;
}

转载于:https://www.cnblogs.com/lyj00912/p/11366683.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/31524.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息