博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数学问题-高精度运算
阅读量:5057 次
发布时间:2019-06-12

本文共 4591 字,大约阅读时间需要 15 分钟。

模板:


#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define I scanf#define OL puts#define O printf#define F(a,b,c) for(a=b;a
=0;a--)#define LEN 10000#define MAX 1<<30#define V vector
#define ll long longusing namespace std;typedef struct hp{ int len; char s[LEN]; hp(){ len=0; memset(s,0,LEN); } hp(const char *ch){ memset(s,0,LEN); len=strlen(ch); for(int i=0;i
=1;i--){ putchar(s[i]+48); } }}hp;hp add(const hp&a,const hp&b){ int i,len=max(a.len,b.len); hp c; for(i=1;i<=len;i++){ c.s[i]+=a.s[i]+b.s[i]; if(c.s[i]>9){ c.s[i+1]++; c.s[i]%=10; } } len++; while(len>1 && c.s[len]==0) len--; c.len=len; return c;}int main(){// freopen("A+B Problem.txt","r",stdin); char a[LEN]; char b[LEN]; scanf("%s",a); scanf("%s",b); add(hp(a),hp(b)).print(); puts(""); return 0; }
View Code

注意0的特殊情况,以及用scanf读入字符串而不能用gets读入(gets会读入空格)


#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define I scanf#define OL puts#define O printf#define F(a,b,c) for(a=b;a
=0;a--)#define LEN 1000000#define MAX 1<<30#define V vector
#define ll long longusing namespace std;typedef struct hp{ int len; char s[LEN]; hp(){ len=0; memset(s,0,LEN); } hp(const char *ch){ memset(s,0,LEN); len=strlen(ch); for(int i=0;i
=1;i--){ putchar(s[i]+48); } }}hp;int compare(const hp&a,const hp&b){ int len=max(a.len,b.len); while(len>0 && a.s[len]==b.s[len]) len--; if(!len) return 0; return a.s[len]-b.s[len];} hp subtract(const hp&a,const hp&b){ //a 大 b小 int i,len=max(a.len,b.len); hp c; for(i=1;i<=len;i++){ c.s[i]+=a.s[i]-b.s[i]; if(c.s[i]<0){ c.s[i+1]--; c.s[i]+=10; } } while(len>1 && c.s[len]==0) len--; c.len=len; return c;}int main(){// freopen("高精度减法.txt","r",stdin); char a[LEN]; char b[LEN]; scanf("%s",a); scanf("%s",b); int d=compare(a,b); if(d<0){ printf("-"); subtract(b,a).print(); } else if(d>0) subtract(a,b).print(); else puts("0"); return 0; }
View Code

注意用compare函数进行大数的大小判断。如果第一个比第二个小就b-a并且输出负号


#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define I scanf#define OL puts#define O printf#define F(a,b,c) for(a=b;a
=0;a--)#define LEN 10000#define MAX 1<<30#define V vector
#define ll long longusing namespace std;typedef struct hp{ int len; char s[LEN]; hp(){ len=0; memset(s,0,LEN); } hp(const char *ch){ memset(s,0,LEN); len=strlen(ch); for(int i=0;i
=1;i--){ putchar(s[i]+48); } }}hp;hp multiply(const hp&a,const hp&b) { int i,j,len=a.len+b.len+1; hp c; for(i=1;i<=a.len;i++){ for(j=1;j<=b.len;j++){ c.s[i+j-1]+=a.s[i]*b.s[j]; c.s[i+j]+=c.s[i+j-1]/10; c.s[i+j-1]%=10; } } while(len>1 && c.s[len]==0 ) len--; c.len=len; return c;}int main(){// freopen("A×B Problem.txt","r",stdin); char a[LEN]; char b[LEN]; scanf("%s",a); scanf("%s",b); multiply(hp(a),hp(b)).print(); puts(""); return 0; }
View Code

这题可以说很简单,只要理解(或者熟背)高精度乘法板子,默写下来就OK了。


 

 

灵活多变的题型:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define I scanf#define OL puts#define O printf#define F(a,b,c) for(a=b;a
=0;a--)#define LEN 10000#define MAX 1<<30#define V vector
#define ll long longusing namespace std;int radix=10;typedef struct hp{ int len; char s[LEN]; hp(){ len=0; memset(s,0,LEN); } hp(const char *ch){ memset(s,0,LEN); len=strlen(ch); for(int i=0;i
='0' && ch[i]<='9') s[len-i]=ch[i]-'0'; else if(ch[i]>='A' && ch[i]<='Z') s[len-i]=ch[i]-'A'+10; } } void print(){ for(int i=len;i>=1;i--){ if(s[i]>=0 && s[i]<=9) putchar(s[i]+'0'); else putchar(s[i]-10+'A'); } }}hp;hp add(const hp&a,const hp&b){ int i,len=max(a.len,b.len); hp c; for(i=1;i<=len;i++){ c.s[i]+=a.s[i]+b.s[i]; if(c.s[i]>=radix){ c.s[i+1]++; c.s[i]%=radix; } } len++; while(len>1 && c.s[len]==0) len--; c.len=len; return c;}int main(){// freopen("D:\\CbWorkspace\\数学问题\\高精度\\B进制星球.txt","r",stdin); char a[LEN]; char b[LEN]; scanf("%d",&radix); scanf("%s",a); scanf("%s",b); add(hp(a),hp(b)).print(); puts(""); return 0; }
View Code

模拟其他进制的高精度运算。只要搞清楚10进制加法的进位原理,只要改一下radix参数就可以了。


 

转载于:https://www.cnblogs.com/TQCAI/p/8469229.html

你可能感兴趣的文章
程序员的鄙视链
查看>>
Service简介 demos
查看>>
influxdb
查看>>
#019 还未搞明白的C语言问题
查看>>
Java-面向对象篇2
查看>>
【编程练习】寻找和为定值的多个数
查看>>
Eclipse中修改Tomcat的发布路径、发布方式、启动超时等信息
查看>>
设计模式——2.简单工厂模式
查看>>
(转)详细解析Java中抽象类和接口的区别
查看>>
php js 排序
查看>>
算法训练 Anagrams问题
查看>>
java BigInteger
查看>>
hdu 4927 Java大数
查看>>
Open vSwitch安装及配置
查看>>
docker 在windows7 、8下的安装
查看>>
代码审计_urldecode二次编码绕过
查看>>
L2-032 彩虹瓶——栈
查看>>
HDFS RAID实现方案
查看>>
Git 命令操作记录
查看>>
2013上半年中国CRM市场分析报告
查看>>