博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高精度四则运算模板
阅读量:4071 次
发布时间:2019-05-25

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

高精度乘法 #include 
#include
#include
#include
#include
#define N 300000using namespace std;char aa[N],bb[N];int lena,lenb,a[N],b[N],ans[N],len,nxt,tmp;int main(){ scanf("%s%s",aa+1,bb+1);lena=strlen(aa+1);lenb=strlen(bb+1); for(int i=1;i<=lena;i++) a[lena-i+1]=(aa[i]-'0'); for(int i=1;i<=lenb;i++) b[lenb-i+1]=(bb[i]-'0'); if(lena
#include
#include
#include
#include
#define N 300000using namespace std;char aa[N],bb[N];int lena,lenb,a[N],b[N],ans[N],len;void check(){ if(lena
#include
#include
#include
#include
#define N 300000using namespace std;char aa[N],bb[N];int lena,lenb,a[N],b[N],ans[N],len;int main(){ scanf("%s%s",aa+1,bb+1);lena=strlen(aa+1);lenb=strlen(bb+1); for(int i=1;i<=lena;i++) a[lena-i+1]=(aa[i]-'0'); for(int i=1;i<=lenb;i++) b[lenb-i+1]=(bb[i]-'0'); for(int i=1;i<=lena;i++) { b[i]+=a[i]; b[i+1]+=b[i]/10; b[i]%=10; } len=lena+1; while(len<=lenb && b[len]>=10) { b[len+1]+=(b[len]/10); b[len]%=10; } if(b[lenb+1]) lenb++; while(lenb) printf("%d",b[lenb--]); return 0;}*/高精除法:保留小数。#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;string a,b,d="0",bb="0";int dif,dns=0,r,all=0;int lena,lenb,qq=0;//qq记录小数点是否已经输出 vector
c;void change(string x,string y)//这里的减法和我写的独立的减法程序一样,不再赘述{ c.clear(); dif=abs(x.length()-y.length());//长度的差值 int len=max(x.length(),y.length()); for(int i=len-1;i>=0;i--) { int a=x[i]-'0'+dns,b=y[i-dif]-'0'; if(len-i > y.length()) { b=0; } int p=a-b; dns=0; if (p < 0) { p+=10; dns=-1; } c.push_back(p); }}void handle(){ int num=0; while(a.length() > b.length() || (b.length() == a.length() && a >= b)) {//只是将除法的过程改为了减法,而这一步就是确定商多少 num++;//每减一次商累加一 change(a,b); int con=1; a="0"; for(int i=c.size()-1;i>=0;i--)//把余数重新转化为string { if(c[i]==0&&con) { continue; } con=0; if(a == "0") a=char(c[i]+48);//0的阿斯科玛是48 else a=a+char(c[i]+48); }//为了不再更改之前写的高精度减法的基础,这里只能将余数转换成string的形式 //之前其实没用char(c[i]+48)的形式但是出现了各种错误,最后才发现这样可以 } cout<
>a>>b; if(b=="0") { cout<<"-1"; return 0; } lena=a.length(); lenb=b.length(); if(a == b) { cout<<"1"; return 0; } if(lena < lenb || (lena == lenb && a < b))//如果被除数小于除数,先输出“0.”,再将被除数加一 { cout<<"0."; a+="0"; while(a.length() < b.length() || (b.length() == a.length() && a < b))//有可能出现加一后被除数仍然小于除数,这时应该继续加 { a+="0"; cout<<"0";//为了模拟手动除法,每次给被除数加末尾数字的时候都应该输出0 } while(all <= 100)//all用来控制输出的位数,这里是输出的小数点后的位数 { handle();//其实这里的handle改自高精度减法的main函数 all++; } } else//被除数大于除数和小于除数的情况差别很大,所以分开写 { r=lenb-1;//记录a中已经读到的位置 //还是模拟除法,每次得到商的一位后都应该从被除数上降下一位到余数,而r就是记录从那里降 //之前大于的情况在因为被除数已经没有位可以降,所以是直接降0,而这里显然不可以 for(int i=0;i
lenb||(d.length()==lenb && d>=b )) { num++; change(d,b);//减法过程 int con=1; d=bb; for(int i=c.size()-1;i>=0;i--) { if(c[i]==0&&con)continue; con=0; if(d == "0") d=char(c[i]+48); else d=d+char(c[i]+48); } } cout<

转载地址:http://brqji.baihongyu.com/

你可能感兴趣的文章
MINIGUI学习笔记之安装使用
查看>>
MINIGUI与共享内存
查看>>
浮点型(FLOAT)与CHAR型转换
查看>>
何为团队?
查看>>
如何做好一个项目经理?
查看>>
寻求工控、自动化合作者建立工控网站!(长期有效)
查看>>
MiniGUI 2.0.3商业版本安装
查看>>
REDHAT 网络通讯源码
查看>>
LINUX 串口通讯源码
查看>>
浙西2日游(4.21-22)
查看>>
LINUX起死回生记
查看>>
网站规划之初稿 (工控帮 http://www.opc-china.com)
查看>>
网站系统之咨询(网奇行业门户)(如此做法怎么能对的起“中国建站第一品牌”)
查看>>
数字电影《大寒小寒》(淳朴,无私)
查看>>
讨论:国内企业对开发的投入是多少
查看>>
LEX与YACC 词汇表
查看>>
个人六年工作回顾
查看>>
春节感想(沂蒙山区的变化)之2008
查看>>
《OPCDA服务器与客户程序开发指南》下载
查看>>
国产PLC应该学习一下国产变频器
查看>>