高精度(加、减、乘、除)

 在位数很大到超过long long的大小的时候需要使用高精度,即使用数组存储数,并模拟数的运算和进位。当然会java,python的可以学一学它自带的函数,十分方便。

 附上加减乘除的代码:

  1 #include<iostream>
  2 #include<string>
  3 using namespace std;
  4
  5 int compare(string str1,string str2){
  6     int len1=str1.length(),len2=str2.length();
  7     if(len1<len2)
  8         return -1;
  9     else if(len1>len2)
 10         return 1;
 11     else
 12         return str1.compare(str2);
 13 }
 14
 15 //高精度加法,只能是两个正数相加
 16 string add(string str1,string str2){
 17     string str;
 18     int len1=str1.length(),len2=str2.length();
 19     if(len1<len2)
 20         for(int i=1;i<=len2-len1;i++)
 21             str1="0"+str1;
 22     else
 23         for(int i=1;i<=len1-len2;i++)
 24             str2="0"+str2;
 25     int cf=0,tmp;
 26     len1=str1.length();
 27     for(int i=len1-1;i>=0;i--){
 28         tmp=str1[i]-‘0‘+str2[i]-‘0‘+cf;
 29         cf=tmp/10;
 30         tmp%=10;
 31         str=char(tmp+‘0‘)+str;
 32     }
 33     if(cf)
 34         str="1"+str;
 35     return str;
 36 }
 37
 38 //高精度减法,只能是两个正数相减,而且要大减小
 39 string sub(string str1,string str2){
 40     string str;
 41     int len1=str1.length(),len2=str2.length();
 42     for(int i=1;i<=len1-len2;i++)
 43         str2="0"+str2;
 44     int cf=0;
 45     for(int i=len1-1;i>=0;i--){
 46         if(str1[i]-cf>=str2[i]){
 47             str=char(str1[i]-cf-str2[i]+‘0‘)+str;
 48             cf=0;
 49         }
 50         else{
 51             str=char(str1[i]-cf-str2[i]+10+‘0‘)+str;
 52             cf=1;
 53         }
 54     }
 55     str.erase(0,str.find_first_not_of(‘0‘));
 56     if(str.empty())
 57         str="0";
 58     return str;
 59 }
 60 //高精度乘法,只能是两个正数相乘
 61 string mul(string str1,string str2){
 62     string str;
 63     int len1=str1.length(),len2=str2.length();
 64     for(int i=len2-1;i>=0;i--){
 65         string tmpstr;
 66         int tmp=str2[i]-‘0‘,cf=0,t;
 67         if(tmp){
 68             for(int j=1;j<=len2-1-i;j++)
 69                 tmpstr+="0";
 70             for(int j=len1-1;j>=0;j--){
 71                 t=(tmp*(str1[j]-‘0‘)+cf)%10;
 72                 cf=(tmp*(str1[j]-‘0‘)+cf)/10;
 73                 tmpstr=char(t+‘0‘)+tmpstr;
 74             }
 75             if(cf)
 76                 tmpstr=char(cf+‘0‘)+tmpstr;
 77         }
 78         str=add(str,tmpstr);
 79     }
 80     str.erase(0,str.find_first_not_of(‘0‘));  //删除前面多余的0,因为如果是0×10,结果将会是00
 81     if(str.empty())
 82         str="0";
 83     return str;
 84 }
 85 //高精度除法,只能是两个正数相除
 86 void div(string str1,string str2,string& con,string &rem){
 87     if(str2=="0")
 88         return;
 89     else if(str1=="0"){
 90         con="0",rem="0";
 91         return;
 92     }
 93     else if(compare(str1,str2)<0){
 94         con="0",rem=str1;
 95         return;
 96     }
 97     else if(compare(str1,str2)==0){
 98         con="1",rem="0";
 99         return;
100     }
101     else{
102         int len1=str1.length(),len2=str2.length();
103         string tmpstr;
104         for(int i=0;i<len2-1;i++)
105             tmpstr=tmpstr+str1[i];
106         for(int i=len2-1;i<len1;i++){
107             tmpstr=tmpstr+str1[i];
108             tmpstr.erase(0,tmpstr.find_first_not_of(‘0‘));
109             if(tmpstr.empty())
110                 tmpstr="0";
111             for(char j=‘9‘;j>=‘0‘;j--){
112                 string str,tmp;
113                 str=str+j;
114                 tmp=mul(str,str2);
115                 if(compare(tmp,tmpstr)<=0){
116                     con=con+j;
117                     tmpstr=sub(tmpstr,tmp);
118                     break;
119                 }
120             }
121         }
122         rem=tmpstr;
123     }
124     con.erase(0,con.find_first_not_of(‘0‘));
125     if(con.empty())
126         con="0";
127 }
128
129 int main(){
130     string str1,str2,con,rem;
131     cin>>str1>>str2;
132     div(str1,str2,con,rem);
133     cout<<con<<endl<<rem<<endl;
134     return 0;
135 }

原文地址:https://www.cnblogs.com/FrankChen831X/p/10340221.html

时间: 2024-08-28 12:10:50

高精度(加、减、乘、除)的相关文章

poj 2756 Autumn is a Genius 高精度加减

题意: 求a+b.-10^50000<a,b<32768. 分析: 题目描述很猥琐,其实要用高精度的,用高精度加减模板. 代码: //poj 2756 //sep9 #include <iostream> using namespace std; const int maxN=60000; char A[maxN],B[maxN]; int L,flag1,flag2,flag3,a[maxN],b[maxN],c[maxN]; void ini() { L=max(strlen(

在axure中实现商品数量加减效果,原型库网站讲师-金乌 解答同学问

有同学在群里提问,如何使用axure制作商品数量增加减少效果,见GIF图.虽然属于初级教程,但很多同学还是小白新手阶段,所以特地录制了详细的视频讲解,供大家学习参考! 该教程由原型库网站录制http://www.yuanxingku.com转载请注明出处! 在axure中实现商品数量加减效果,原型库网站讲师-金乌 解答同学问,布布扣,bubuko.com

去除input[type=number]最右边的spinners(默认加减符号)

// 去掉input[type=number]默认的加减号 input[type='number'] { -moz-appearance:textfield; } input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } input[type=number]有时会出现默认的加减spinne

DateTime操作,时间范围,加减

DB里边存的是char类型数组的时间,例如20151111 12171220000,现在需要把这个时间加减5s,组成 一个时间范围 然后再写存储过程. 想到的办法就是把这个时间先转换成DateTime,然后DateTime本身有可以做加减的方法.做好之后sql的时候有对应的方法 我的解决方法最后是: DateTime dt = DateTime.ParseExact("20151111 12171220000".substring(0,15),"yyyyMMddHHmmss&

小巧实用的数字加减插件(jquery插件)

自己的第一个jquery插件,规模虽然不大,但是小成就满满,对jquery又有了更进一步的认识. 简单实用的数字加减插件,实现通过加减按钮对文本框内的数字进行增减操作. 效果图: 参数: 默认值.最大值.最小值.增减度. 可单独对每个input设置参数,也可以对所有input统一设置.参考代码在下方: 使用方法: 1.引用css.js文件(记得引用jquery.min.js) 2.前台: 2.1无参数 <input type="text" class="numberTe

矩阵基本操作(加减乘、求逆、转置)

看模板,寻找的最好理解,最好用的矩阵基本操作的模板 #define MAXN 100 #define zero(x) (fabs(x)<1e-10) struct mat { int n,m; double data[MAXN][MAXN]; }; ///矩阵加减乘 int add(mat& c,const mat& a,const mat& b) { int i,j,k; if (a.m!=b.m||a.n!=b.n) return 0; c.n=a.n; c.m=a.m;

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

shell--日期格式化显示和日期的加减

1. 显示当前日期时间. $ dateMon Jun 2 13:55:47 HKT 2014 2. 按照指定格式显示当前时间(date +format). (1). 显示年月日. $ date "+%Y-%m-%d"2014-06-02 $ date "+%F"2014-06-02 $ date "+%Y/%m/%d"2014/06/02 格式也可以不用引号,但是最好加引号(不然中间有空格的话还得转义!). $ date +%Y/%m/%d 20

Python中的日期的加减如何实现?

本文和大家分享的主要是python中日期加减操作相关内容,一起来看看吧,希望对大家学习python有所帮助. 1. 日期输出格式化 所有日期.时间的api都在datetime模块内. 1. datetime => string now = datetime.datetime.now() now.strftime('%Y-%m-%d %H:%M:%S')#输出2012-03-05 16:26:23.870105 strftime是datetime类的实例方法. 2. string => date

mysql--timestamp加减

利用timestamp()对timestamp类型进行秒加减操作: 1.加10秒: 2.减10秒: