大数加减法
2015-08-31 10:04
363 查看
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> #define ll long long #define esp 1e-10 using namespace std; struct BigInteger { char num[10000]; BigInteger(){} BigInteger(const char *s) { while(*s=='0') s++; if(*s==0) s--; strcpy(num,s); } BigInteger operator + (const BigInteger rr)const { char sum[10000]; int ptr=9998; memset(sum,0,sizeof(sum)); int lenl=strlen(num); int lenr=strlen(rr.num); const char *l=num; const char *r=rr.num; int i,j; for(i=lenl-1,j=lenr-1;i>=0&&j>=0;i--,j--) { int a=l[i]-'0'; int b=r[j]-'0'; int c=a+b+sum[ptr]; if(c<10) sum[ptr--]=c+'0'; else { sum[ptr-1]++; sum[ptr--]=(c-10)+'0'; } } const char *sec=lenl>lenr?l:r; int cnt=lenl>lenr?i:j; for(int k=cnt;k>=0;k--) { int a=sec[k]-'0'; int c=a+sum[ptr]; if(c<10) sum[ptr--]=c+'0'; else { sum[ptr-1]++; sum[ptr--]=(c-10)+'0'; } } sum[ptr]==1?(sum[ptr]+='0'):(ptr++); return BigInteger(&sum[ptr]); } BigInteger operator - (const BigInteger rr)const { if(!strcmp(num,rr.num)) return BigInteger("0"); char sum[10000]; int ptr=9998; memset(sum,0,sizeof(sum)); int lenl=strlen(num); int lenr=strlen(rr.num); const char *l=num; const char *r=rr.num; bool isNegative=false; if(lenl<lenr||(lenl==lenr&&strcmp(num,rr.num)<0)) { swap(lenl,lenr); swap(l,r); isNegative=true; } int i,j; for(i=lenl-1,j=lenr-1;i>=0&&j>=0;i--,j--) { int a=l[i]-'0'; int b=r[j]-'0'; int c=a-b+sum[ptr]; if(c>=0) sum[ptr--]=c+'0'; else { sum[ptr-1]--; sum[ptr--]=(c+10)+'0'; } } const char *sec=l; for(int k=i;k>=0;k--) { int a=sec[k]-'0'; int c=a+sum[ptr]; if(c>=0) sum[ptr--]=c+'0'; else { sum[ptr-1]--; sum[ptr--]=(c+10)+'0'; } } while(sum[++ptr]=='0'); //sum[ptr+1]=='0'?ptr+=2:(ptr++); if(isNegative) sum[--ptr]='-'; return BigInteger(&sum[ptr]); } }; char s1[1000],s2[1000]; int main() { //freopen("lalala.text","r",stdin) ; while(~scanf("%s %s",s1,s2)) { BigInteger a(s1); BigInteger b(s2); printf("%s\n",(a-b).num); } return 0; }
相关文章推荐
- 未能加载文件或程序集“XXX”或它的某一个依赖项。磁盘空间不足---解决方案
- [软件工程]提前完成任务的风险如何定义
- 页面 Backspace 功能禁锢
- 未能加载文件或程序集“XXX”或它的某一个依赖项。磁盘空间不足---解决方案
- 问题:C#时间差;结果:C# 使用TimeSpan计算两个时间差
- 【LeetCode】70. Climbing Stairs
- 创建Windows服务(Windows Services)N种方式总结
- 压缩、打包和解压缩
- 干货分享!不得不看的【7年竞价实战经验总结】
- vs2010 查看汇编代码
- 【wed】wed网页随机产生验证码图片(版本tomcat-8.0.14)
- python
- 大家在抢红包,程序员在研究红包算法
- "svn检出"has encountered a problem cannot checkout
- 【GlassFish入门】向社区贡献代码
- HandlerMapping
- 【java】for循环语句的3种遍历方法
- SylixOS Shell使用
- 图片延迟加载
- 回调函数和函数指针