【多题合集】高精度加减乘除
来源:互联网 发布:php 异步执行函数 编辑:程序博客网 时间:2024/05/21 17:30
高端:高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
自言自语:oi生涯最恨高精度和字符串,代码打的也非常脑残,所以╮(╯▽╰)╭……
——————————————————————————————————————————————
3116 高精度练习之加法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A+B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
15
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int main(){ char d[502],e[502]; int a[502],c[502]; int b[502]; int ss=0,hh=0; cin>>d; cin>>e; int l1=strlen(d),l2=strlen(e),i,x; for (i=0;i<=l1-1;i++) a[i]=d[i]-'0'; for (i=0;i<=l2-1;i++) b[i]=e[i]-'0'; //字符串转化数字 if (l1>=l2) { for (i=0;i<=l1-l2-1;i++) c[i]=0; for (i=l1-l2;i<=l1-1;i++) c[i]=b[l2-l1+i]; } else { for (i=0;i<=l2-l1-1;i++) c[i]=0; for (i=l2-l1;i<=l2-1;i++) c[i]=a[l1-l2+i]; } //补零 x=max(l1,l2); if (l1>=l2) {for (i=x-1;i>=1;i--) {b[i]=a[i]+c[i]; if (b[i]>=10) { b[i]-=10; c[i-1]++; }} if (a[0]+c[0]>=10) { b[0]=a[0]+c[0]-10; cout<<1; } else b[0]=a[0]+c[0]; for (i=0;i<=x-1;i++) cout<<b[i];} //++(a长) else {for (i=x-1;i>=1;i--) {a[i]=b[i]+c[i]; if (a[i]>=10) { a[i]-=10; c[i-1]++; }} if (b[0]+c[0]>=10) { a[0]=b[0]+c[0]-10; cout<<1; } else a[0]=b[0]+c[0]; for (i=0;i<=x-1;i++) cout<<a[i];} //++(b长) }
3115 高精度练习之减法
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A-B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
-9
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
#include<cstdio>#include<cstring>using namespace std;char a[501],b[501];int c[501],d[501],l1,l2,l,mi;bool flag;void f(char x[],char y[]){ bool flag=false; for (int i=1;i<=l;i++) { c[i]=x[i-1]-'0'; d[l-mi+i]=y[i-1]-'0'; } for (int i=l;i>=1;i--) if (c[i]-d[i]<0) { c[i-1]--; c[i]=c[i]+10-d[i]; } else c[i]=c[i]-d[i]; for (int i=1;i<=l;i++) if ((c[i]!=0)||(flag)) { printf("%d",c[i]); flag=true; }}int main(){ flag=false; scanf("%s",&a); scanf("%s",&b); l1=strlen(a); l2=strlen(b); if (l1>l2) { l=l1; mi=l2; f(a,b); } else if (l1<l2) { l=l2; mi=l1; printf("-"); f(b,a); } else { flag=true; for (int i=0;i<=l1;i++) if (a[i]>b[i]) { l=l1; f(a,b); flag=false; break; } else if (a[i]<b[i]) { l=l2; mi=l1; printf("-"); f(b,a); flag=false; break; } } if (flag) printf("0");}
3117 高精度练习之乘法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A*B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
36
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
#include<iostream>#include<cstring>using namespace std;int an[501],bn[501],c[1001];main(){ char a[501],b[501]; cin>>a; cin>>b; int jw,la=strlen(a),lb=strlen(b); for (int i=1;i<=la;i++) an[i]=a[i-1]-48; for (int i=1;i<=lb;i++) bn[i]=b[i-1]-48; for (int i=la;i>=1;i--) { for (int j=lb;j>=1;j--) { c[i+j]=c[i+j]+an[i]*bn[j]; jw=c[i+j]/10; c[i+j-1]=jw+c[i+j-1]; c[i+j]%=10; } } bool flag=false; for (int i=1;i<=la+lb;i++) if ((flag)||(c[i]!=0)){cout<<c[i];flag=true;} return 0;}
3118 高精度练习之除法
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
题解
题目描述 Description
给出两个正整数A和B,计算A/B整数部分的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A/B整数部分的值
样例输入 Sample Input
15 4
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
#include<cstdio>#include<string>#include<iostream>#include<cstring>using namespace std;char s1[510],s2[510];int a[510],b[510],c[510],ans[510];int compare(){ if (a[0]>c[0]) return 1; if (a[0]<c[0]) return -1; for (int i=c[0];i>=1;i--) if (a[i]>c[i]) return 1; else if (a[i]<c[i]) return -1; return 0;} void solve(int x){ for (int i=1;i<=b[0];i++) c[i+x-1]=b[i]; c[0]=b[0]-1+x;}void f(){ for (int i=1;i<=a[0];i++) { if (a[i]-c[i]<0) {a[i]+=10;a[i+1]--;} a[i]-=c[i]; } while (a[0]>0&&a[a[0]]==0) a[0]--;}main() { scanf("%s%s",s1,s2); a[0]=strlen(s1); b[0]=strlen(s2); if (a[0]<b[0]||(a[0]==b[0]&&strcmp(s1,s2)<0)) {printf("0");return 0;} for (int i=1;i<=a[0];i++) a[i]=s1[a[0]-i]-48; for (int i=1;i<=b[0];i++) b[i]=s2[b[0]-i]-48; ans[0]=a[0]-b[0]+1; for (int i=ans[0];i>=1;i--) { memset(c,0,sizeof(c)); solve(i); while (compare()>=0) { f(); ans[i]++; } } while (a[0]>1&&a[a[0]]==0) a[0]--; for(int i=a[0];i>=1;i--) printf("%d",a[i]); if (a[0]==0) printf("0"); }
- 【多题合集】高精度加减乘除
- 高精度加减乘除
- 高精度加减乘除
- 高精度加减乘除
- 高精度 <加减乘除>
- 高精度加减乘除
- 大数据/高精度加减乘除
- 高精度abcdefg加减乘除模板。
- 高精度加减乘除模板
- 高精度 加减乘除 【精华】
- 大数高精度加减乘除模板
- 大整数高精度加减乘除
- 高精度算法,加减乘除
- 大数(高精度)加减乘除取模
- 高精度加减乘除类的实现
- 高精度---BigDecimal类的加减乘除
- 高精度运算 加减乘除阶乘幂
- 高精度加减乘除的笔记+代码
- Oracle修改默认时间格式
- Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态
- Oracle 获取当前年、月、日
- php解压缩文件方法汇总
- Discuz 站点URL静态化(修改.htaccess文件设置Rewrite规则)
- 【多题合集】高精度加减乘除
- Linux下启动停止查看杀死Tomcat进程
- memwatch 内存检测工具
- sql分组查询最大值或最小值
- 在IONIC中巧用IFRAME解决跳转到第三方平台时不能回调的问题-比如支付
- 远程桌面不能复制粘贴解决办法
- mysql开启远程访问并解决远程访问慢
- mysql 时间列自动插入当前日期时间
- stringByAddingPercentEscapesUsingEncoding