当前位置: 首页 > news >正文

阳春网站建设/广州seo全网营销

阳春网站建设,广州seo全网营销,公司付的网站费怎么做分录,山西企业网站建设高精度算法高精度的整体思路:一、加法1、思路:2、模板:(1)C版:(2)C语言版:二、减法1、思路:2、模板:CC三、乘法1、思路:2、模板&#…

高精度算法

  • 高精度的整体思路:
  • 一、加法
    • 1、思路:
    • 2、模板:
      • (1)C++版:
      • (2)C语言版:
  • 二、减法
    • 1、思路:
    • 2、模板:
      • C++
      • C
  • 三、乘法
    • 1、思路:
    • 2、模板:
      • C++
  • 四、除法
    • 1、思路:
    • 2、模板:
      • C++
  • 五、总结:

高精度的整体思路:

为什么一个数据会存在最大数?我们知道,一个数字会转化成二进制存储在内存中。而每个二进制位都会消耗一个比特位。我们以int 为例,其大小是4个字节,32个比特位。因此,其所表示的最大数即32个比特位全是1的时候。

因此,我们只要打破内存的限制,就能实现超级大的数字之间的加减乘除运算。那么如何打破呢?此时我们就需要用到我们学过的数组,我们的数组可以在相应的内存区域限制内不断地开辟,从而满足我们的需要。

因此高精度的本质就是利用数组模拟各种运算法则,从而得到结果。

一、加法

1、思路:

在这里插入图片描述
我们以上述图示为例子,我们创建两个数组,模拟两个数字的位数,从个位开始运算。

我们创建一个中间变量t来存储每一位两个数字加起来的结果。但是我们需要注意的是,结果中的每一位不仅来自A,B两个数字中对应位数的相加,还包括前一位的进位。

个位的加减是没有前一位的进位的,因此我们初始化 t 为0。然后运算结果如上图所示。我们将t%10后,就是该位所应保留的数字,然后将t在/=10,此时t就保留了进到下一位中的进位。

因此,我们这里要写成:t += A[i] + B[i]。一定是+=!!。否则就会丢掉进位。不懂得话,可以详细看上面图片中的手写例子。

但是我们还需要注意的一点就是,当我们算到最后一位的时候,最后一位计算结束的时候,我们的t有可能依然有进位。由于A,B已经没有下一位了。所以如果不特殊处理以下的话,这一位就丢掉了。因此我们用if语句判断一下,如果存有进位,则再开一位存储1。

另外的一些细节,我们看完模板再解释。

2、模板:

(1)C++版:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>add(vector<int>&A,vector<int>&B)
{int t=0;vector<int>C;for(int i=0;i<A.size()||i<B.size();i++){if(i<A.size())t+=A[i];if(i<B.size())t+=B[i];C.push_back(t%10);t/=10;}if(t!=0)C.push_back(1);return C;
}
int main()
{string a,b;vector<int>A,B;cin>>a>>b;//倒序存储数组for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');//调用加法函数vector<int>C=add(A,B);//倒序输出结果for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);return 0;
}

(2)C语言版:

#include<stdio.h>
#include<string.h>
char a[100005];
char b[100005];
int A[100005];
int B[100005];
int C[100005];int main()
{scanf("%s",a);scanf("%s",b);int lena = strlen(a);int lenb = strlen(b);//逆序数组for (int i = 0; i < lena;i++){A[lena - i - 1] = a[i] - '0';}for (int i = 0; i < lenb;i++){B[lenb - i - 1] = b[i] - '0';}//判断结果的最大位数int lenc = (lena > lenb ? lena : lenb)+1;//开始加法int t=0;int i;for (i = 0; i < lenc;i++){t+=A[i]+B[i];C[i]=t%10;t/=10;}if(t!=0)C[i]=1;//删除前导零,避免出现:000012的情况。但是要注意0这种特殊情况while(C[lenc]==0&&lenc>0){lenc--;}for (int i = lenc; i >= 0;i--){printf("%d",C[i]);}return 0;
}

我们这里解释一下为什么要倒置数组,因为我们输入一个字符串后,第一个元素是最高位。但是我们上述图片举得例子中,第一个元素是个位,所以我们需要倒置数组,不要忘记剪掉:'0'
在这里插入图片描述

二、减法

1、思路:

请添加图片描述
减法依旧是去模拟一个竖式的计算,上面的图片中就是我们小学数学中所熟悉的式子。那么我们从编程的角度去审视一下上面的代码:
请添加图片描述
通过上面的代码,我们可以总结出减法中的关键思路:
创建一个临时变量t,这个t就是辅助我们去计算每一位的。那么这个t代表的是进位。同时我们也利用t来存储每一位运算的结果,然后再通过对t的取模运算得到每一位的结果,然后再通过A[i]-B[i]-t的正负去判断进位。
这里我们解释一下,当A[i]-B[i]小于0的时候,说明我们是需要借位的,借位其实就是给这个负数的结果加上一个10,因为我们借位了,所以t要等于1。所以在下一位的计算过程中,我们就要多减去一个1,那么多减去的这个1就体现在 - t 中。

当我们的结果是负数的时候,我们还需要去模拟那个负数,因此我们需要先判断一下正负,然后预先得知是否打印负号,然后我们再去求二者相减的绝对值即可。

接着下来的话,我们需要还需要解决一下前导零的问题:比如777-772=005。5之前的00是没必要打印的,我们直接删除即可。

2、模板:

C++

#include<iostream>
#include<vector>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B)
{if(A.size()!=B.size())return A.size()>B.size();else{for(int i=A.size()-1;i>=0;i--){if(A[i]!=B[i])return A[i]>B[i];}}return true;
}
vector<int>sub(vector<int>&A,vector<int>&B)
{vector<int>C;int t=0;for(int i=0;i<A.size();i++){t=A[i]-t;if(i<B.size())t-=B[i];if(t>=0){C.push_back(t);t=0;}else{C.push_back(t+10);t=1;}}while(C.size()>1&&C.back()==0)C.pop_back();return C;
}
int main()
{vector<int>A,B,C;string a,b;cin>>a>>b;for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');if(cmp(A,B)){C=sub(A,B);}else{C=sub(B,A);cout<<"-";}for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);return 0;
}

C

#include<stdio.h>
#include<string.h>char a[100010],b[100010];
int A[100010],B[100010],C[100010];int cmp(int*A,int*B,int lena,int lenb)
{int len=lena-lenb;if(len!=0){return len;}else{for(int i=lena-1;i>=0;i--){if(A[i]!=B[i]){return A[i]-B[i];}}}return 0;
}int sub(int*A,int*B,int*C,int lena,int lenb)
{int t=0,lenc=0;for(int i=0;i<lena;i++){t=A[i]-t;if(i<lenb)t-=B[i];if(t>=0){C[i]=t;t=0;}else{C[i]=t+10;t=1;}lenc++;}while(lenc>1&&C[lenc-1]==0)lenc--;return lenc;
}int main()
{scanf("%s %s",a,b);int lena=strlen(a);int lenb=strlen(b);int lenC=0;for(int i=0;i<lena;i++)A[i] = a[lena - i - 1] - '0';for(int i=0;i<lenb;i++)B[i]=b[lenb-i-1]-'0';if(cmp(A,B,lena,lenb)>=0){lenC=sub(A,B,C,lena,lenb);}else{lenC=sub(B,A,C,lenb,lena);printf("-");}for(int i=lenC-1;i>=0;i--)printf("%d",C[i]);return 0;
}

三、乘法

1、思路:

我们这里的乘法介绍的是一个较小的数乘以一个大整数,即只把大整数存储到数组中,而这个较小的数字依旧存储在一个整型当中。思路如下所示:
在这里插入图片描述

2、模板:

C++

#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int>&A,int&b)
{vector<int>C;int t=0;for(int i=0;i<A.size()||t>0;i++){if(i<A.size())t+=A[i]*b;C.push_back(t%10);t=t/10;}while(C.size()>1&&C.back()==0)C.pop_back();return C;
}
int main()
{string a;int b;cin>>a>>b;vector<int>A;for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');vector<int>B=mul(A,b);for(int i=B.size()-1;i>=0;i--)printf("%d",B[i]);return 0;
}

四、除法

我们这里说的除法是一个大整数除以一个存储在int类型中的数字。

1、思路:

请添加图片描述

如上图所示,我们创建一个临时的变量t。这个t有两个作用:第一个作用是计算结果的每一位,第二个作用是记录最终的余数。

2、模板:

C++

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;vector<int>div(vector<int>&A,int&B,int&t)
{t=0;vector<int>C;for(int i=A.size()-1;i>=0;i--){t=t*10+A[i];C.push_back(t/B);t=t%B;}reverse(C.begin(),C.end());while(C.size()>1&&C.back()==0)C.pop_back();return C;
}int main()
{string a;vector<int> A;int B;cin>>a>>B;for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');vector<int> C;int c;C=div(A,B,c);for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);puts("");cout<<c;return 0;
}

五、总结:

我们发现上述的模板中都有一个相似的思路:我们都创建了一个临时变量t,这个变量的作用就是来计算每一位,同时去存储进位或者余数。当大家忘记时,自己模拟一下,即可写出上述的模板。希望大家多多研究图片中的例子。

http://www.jmfq.cn/news/5180275.html

相关文章:

  • 南京网站制作哪家好/网店推广方法有哪些
  • 百度给企业做网站吗/广州抖音推广公司
  • 网站建设找盖亚科技/在线识别图片来源
  • 做网站的收益在哪/王通seo教程
  • 武汉做网站哪里好/优化疫情防控措施
  • 杭州企业网站建设/知乎关键词排名
  • 平度网站建设ld4/推介网
  • 阿里妈妈 该网站的域名已经被其他人绑定/seo网站推广经理
  • 面试建设单位在哪个网站/网络推广工作内容
  • 万网服务器网站建设/网站友链查询源码
  • 阜阳网站建设价格/竞价排名点击器
  • 苏州市建设安全监督局网站/排名优化方案
  • 襄州区城乡建设局网站/江门seo
  • 芸志建站怎么建立网站/网络公关公司收费
  • 设计网站会员/海外营销
  • 餐饮企业网站建设方案书/sem竞价推广怎么做
  • 网站使用说明书/免费的行情网站app
  • 网站建设标书模板下载/ks免费刷粉网站推广
  • 深圳做棋牌网站建设找哪家公司好/百度推广免费
  • 企业网站推广案例/一个产品的市场营销策划方案
  • 做3d任务的网站/成都网站seo外包
  • 怎么让网站排名上去/电商产品推广方案
  • 做英文网站价格/百度竞价渠道代理商
  • 无锡网站建设 首选众诺/百度极速版app下载安装挣钱
  • 网站建设哪里比较好/免费网页制作网站
  • 推荐完善政府网站建设/深圳全网推广
  • 开源展示型网站/优化课程设置
  • php个人网站源码带音乐/网站设计师
  • 家居企业网站建设流程/品牌运营具体做什么
  • 网站建设框架/代写文章价格表