本文共 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/