大数加减乘模板(十进制)
来源:互联网 发布:欧洲历史书籍推荐知乎 编辑:程序博客网 时间:2024/05/22 11:56
这个模板可以处理大数基本上所有的情况,正负数,零,加减乘都是可以的
#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e6+10;char str1[maxn],str2[maxn],ans[maxn];string s1,s2;bool flag1,flag2;char check;void Add(char *a,char *b,char *res){ int lena = strlen(a); int lenb = strlen(b); int i=lena-1,j=lenb-1,k=0; while((i+1)||(j+1)) { if(i!=-1)res[k]+=(int)(a[i--]-'0'); if(j!=-1)res[k]+=(int)(b[j--]-'0'); res[k+1]+=res[k]/10; res[k++]%=10; } while(!res[k]&&k>1)k--; if(res[k])k++; res[k]=0; for(int s=k-1; s>=0; s--) res[s]+='0'; for(int s=0; s<=(k-1)/2; s++) swap(res[s],res[k-1-s]);}void Sub(char *a,char *b,char *res){ int lena = strlen(a); int lenb = strlen(b); int ans[maxn]; memset(ans,0,sizeof(ans)); int i=lena-1,j=lenb-1,k=0; while((i+1)||(j+1)) { if(j!=-1)ans[k]+=a[i--]-b[j--]; else ans[k]+=a[i--]-'0'; if(ans[k]<0) { ans[k+1]-=1; ans[k]+=10; } k++; } while(ans[k]==0&&k>=1)k--; for(int s=k; s>=0; s--) res[s]=ans[s]+'0'; for(int s=0; s<=k/2; s++) swap(res[s],res[k-s]); res[k+1]=0;}void Mul(char *a,char *b,char *res){ int lena = strlen(a); int lenb = strlen(b); int k=0; for(int i=0;i<lena; i++) for(int j=0; j<lenb; j++) { res[i+j]+=(int)((a[lena-1-i]-'0')*(b[lenb-1-j]-'0')); if(res[i+j]>7) { res[i+j+1]+=res[i+j]/10; res[i+j]%=10; if(i+j+1>k)k=i+j+1; } else if(res[i+j]&&i+j>k)k=i+j; } for(int s=k; s>=0; s--) res[s]+='0'; for(int s=0;s<=k/2;s++) swap(res[s],res[k-s]);}void init(){ memset(ans,'\0',sizeof(ans)); flag1 = flag2 = false; if(s1[0] != '-') for(int i = 0;i < s1.size();i++) str1[i] = s1[i]; else {flag1 = true;for(int i = 1;i < s1.size();i++) str1[i-1] = s1[i];} if(s2[0] != '-') {for(int i = 0;i < s2.size();i++) str2[i] = s2[i];} else {flag2 = true;for(int i = 1;i < s2.size();i++) str2[i-1] = s2[i];}}void judge(){ int l1 = strlen(str1),l2 = strlen(str2); if(l1 < l2) check = '2'; else if(l1 > l2) check = '1'; else{ for(int i = 0;i <= strlen(str1);i++){ if(str1[i] > str2[i]) {check = '1';return ;} if(str1[i] < str2[i]) {check = '2';return ;} } check = '=';return ; }}void print(){ for(int i = 0;i < strlen(ans);i++) printf("%c",ans[i]); puts("");}void ADD(){ if(flag1&&flag2) {Add(str1,str2,ans);printf("-");print();}//同负 else if(!flag1&&flag2){//1正2负 if(check == '1'){Sub(str1,str2,ans);print();} else if(check == '2') {Sub(str2,str1,ans);printf("-");print();} else puts("0"); } else if(flag1&&!flag2){//1负2正 if(check == '1'){Sub(str1,str2,ans);printf("-");print();} else if(check == '2') {Sub(str2,str1,ans);print();} else puts("0"); } else {Add(str1,str2,ans);print();}//同正}void SUB(){ if(flag1&&flag2){//同负 if(check == '2'){Sub(str2,str1,ans);print();} else if(check == '1') {Sub(str1,str2,ans);printf("-");print();} else puts("0"); } else if(!flag1&&flag2){Add(str1,str2,ans);print();}//1正2负 else if(flag1&&!flag2){Add(str1,str2,ans);printf("-");print();}//1负2正 else {//同正 if(check == '1'){Sub(str1,str2,ans);print();} else if(check == '2') {Sub(str1,str2,ans);printf("-");print();} else puts("0"); }}void MUL(){ if(str1[0] == '0'||str2[0] == '0') puts("0"); else if(flag1&&flag2){Mul(str1,str2,ans);print();}//同负 else if(!flag1&&flag2){Mul(str1,str2,ans);printf("-");print();}//1正2负 else if(flag1&&!flag2){Mul(str1,str2,ans);printf("-");print();}//1负2正 else{Mul(str1,str2,ans);print();}//同正}int main(){ freopen("2.in","r",stdin); freopen("2(1).out","w",stdout); while(cin>>s1>>s2){ init(); judge(); //ADD(); //SUB(); MUL(); } return 0;}
阅读全文
0 0
- 大数加减乘模板(十进制)
- 【模板】高精度(加减乘)
- 【高精度计算】加减乘模板(水)
- 【模板】高精度--加减乘
- 大数模板(大数乘小数)
- c++实现大数的加减乘运算(数组存放)
- 重载的可加减乘的点(向量)模板
- 大数的加减乘阶乘,java实现
- 大数运算:支持加减乘运算
- 大数比较加减乘法模板
- 【模板】高精度 加减乘 重载法
- 个人实现的大数模板(加、乘)
- 运算符(加减乘)
- integer of unlimited size(大数类的加减乘)
- Java 大数加减乘(无除),不含小数点
- 大数(乘除法)
- 大数(加、减、乘、除、低精度*大数)模板详解(C++)
- 【高精度模板】【高精加减乘没有除】
- 自己动手做计算机-计算机科学的本质
- 0815记录
- 流程控制-if-else语句
- HDU6114-Chess
- hdu 4552 && 3336 【KMP算法中对next数组的理解】
- 大数加减乘模板(十进制)
- Linux下的tar压缩解压缩命令详解
- maven 笔记
- 廖雪峰Python教程阅读笔记——3. 高级特性
- jsp中文件路径
- 动态规划总结
- 慢日志
- [离散对数] uva 11916 Emoogle Grid
- IOPS与吞吐量