C++高精度算法—大数加大数,大数乘以小数
来源:互联网 发布:100以内的质数 算法 编辑:程序博客网 时间:2024/04/29 01:38
一次偶然的机会,看到百度面试题中出现了很多关于处理大数据的处理题目,也称作高精度题目,另外在ACM竞赛中也偶尔会碰到。我们知道在C语言或C++语言中,通常受机器字长的限制,我们会碰到如果某个整数的范围超过一个范围就没法运算。这时我们只能先用字符串读进去,然后再将字符型的“数”转换成数值的“数”,再模拟手算,一位一位相加,最后得到结果。
具体请看下面的例子:
#include <iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>using namespace std;/*****任务:高精度,计算大数乘以小数******参数:被乘数a[],乘数b;******结果存储在a[]中***************/int Mul(char a[],int b){ int i,j,len; char tmp[1000]; len=strlen(a); for(i=0;i<len;i++) tmp[len-i-1]=a[i]-'0'; //将字符数组a转换成整型数组,并逆序记录在tmp中 int c=0,s; for(j=0;j<len;j++) //模拟人工手算 { s=tmp[j]*b+c; //记录每次相乘的结果(包括进位) tmp[j]=s%10; c=s/10; } while(c) //对数据位数修正 { tmp[len++]=c%10; c/=10; } for(i=0;i<len;i++) a[i]=tmp[len-1-i]+'0'; //再次逆序并换成字符数组 for(i=0;i<len;i++) cout<<a[i]; cout<<endl; return 0;}/****高精度:大数加大数模板*****参数:两个字符数组a[],b[]*****结果保存在ans[]中*********/int add(char a[],char b[]){ int i,j,s,len,c=0; char ans[10000]; int temp_a[10000],temp_b[10000],temp_ans[10000]; memset(ans,0,sizeof(ans)); memset(temp_a,0,sizeof(temp_a)); memset(temp_b,0,sizeof(temp_b)); memset(temp_ans,0,sizeof(temp_ans)); len=max(strlen(a),strlen(b)); for (i=0;i<strlen(a);i++) temp_a[strlen(a)-i-1]=a[i]-'0';//字符数组转换为整型数组 for (i=0;i<strlen(b);i++) temp_b[strlen(b)-i-1]=b[i]-'0'; for(j=0;j<len;j++) //模拟手算 { s=temp_a[j]+temp_b[j]+c; temp_ans[j]=s%10; c=s/10; } if(c) temp_ans[len++]=c; //数据位数修正 for (i=0;i<len;i++) //整型数组转字符数组 ans[len-1-i]=temp_ans[i]+'0'; for(int i=0;i<len;i++) //输出结果 cout<<ans[i]; cout<<endl; }int main(){ char a[1000],b[1000]; int m; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); cout<<"模拟大数乘以小数:"<<endl; cin>>a>>m; Mul(a,m); cout<<"模拟大数加大数: "<<endl; cin>>a>>b; add(a,b); return 0;}程序运行结果:
通过这个例子,可以解决一般的大数相加问题,同时只要稍作调整,也可以写出大数乘以大数,大数阶乘,大数除以大数的相应算法。
0 0
- C++高精度算法—大数加大数,大数乘以小数
- C++实现——大数乘以小数
- 数学问题--大数乘以小数,大数乘以大数,大数的加法以及减法
- 精度计算-大数加大数
- 高精度之大数乘小数
- 大数(高精度数)模板
- 大数乘以大数
- 大数乘以整形数nyoj 155
- 大数算法——高精度大数幂次
- 大数/小数,大数%小数
- 高精度_大数除模小数运算
- 大数与小数相乘算法
- 算法提高 高精度乘法 ————大数乘法
- C语言精度计算——大数乘小数
- [转]POJ 1001 Exponentiation Java大数处理高精度小数
- 大数乘法(大数乘小数)c语言版
- [算法C语言描述]大数、巨数的阶乘算法
- C++类 高精度(大数算法)加减乘除
- nike air max eTLC rCrE Ri1lv
- The 'Black Sun' Effect in CMOS Sensors
- [LeetCode] Search a 2D Matrix
- Algorithm Oct30
- 黑马程序员--java高新技术--jdk1.5新特性
- C++高精度算法—大数加大数,大数乘以小数
- 《HotSpot实战》笔记4垃圾收集
- [LeetCode] Simplify Path
- 给qlineedit创建简单的clicked 信号方式。
- 10 simple Tips to Avoid Violating Google Adsense TOS Read more: 10 simple Tips to avoid violating G
- 有关人、社会的本质的思考--现代的捕蛇者说
- AWK
- 自助Linux之问题诊断工具strace
- Java报错No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing