C++高精度算法的使用场景详解_第1页
C++高精度算法的使用场景详解_第2页
C++高精度算法的使用场景详解_第3页
C++高精度算法的使用场景详解_第4页
C++高精度算法的使用场景详解_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++高精度算法的使用场景详解目录描述1.高精度加法1.思路2.代码2.高精度减法1.思路2.代码3.如果出现被减数的位数小于减数时呢

描述

如果要计算的数超过了longlong怎么解决使用高精度加减乘除,简单理解就是很大的数进行加减乘除。

1.高精度加法

1.思路

创建对应的数组变量及其他变量输入字符串将读入的数据转化为整数类型,并逆序(反转)存储到数组中将两个数组做累加(注意进位)判断最高位是否为0,大于0代表进位了,则让长度加1倒序输出

2.代码

#includebits/stdc++.h

usingnamespacestd;

inta[510],b[510],c[510];//a:被加数b:加数c:和

intmain(){

//1.输入字符串

stringstr1,str2;

cinstr1str2;

//2."1,2,3,4"转换为{1,2,3,4},并且反转{4,3,2,1}

for(inti=0;istr1.size();i++)

a[str1.size()-1-i]=str1[i]-'0';

for(inti=0;istr2.size();i++)

b[str2.size()-1-i]=str2[i]-'0';

//3.找两个字符串最大的个数,目的是为了将每一位计算完

intans=max(str1.size(),str2.size());

//4.相加(a+b)

for(inti=0;ians;i++){//遍历至最大长度,避免有的数字没计算

c[i]+=a[i]+b[i];//相加

c[i+1]=c[i]/10;//进位

c[i]%=10;//将加的结果求余10得出第i位

//4.如果结果数组第ans位的数大于0(大于0代表进位了),则让长度增加1

while(c[ans]0)ans++;

//5.倒序输出

for(inti=ans-1;ii--)

coutc[i];

return0;

}

#includebits/stdc++.h

usingnamespacestd;

inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加数1b:加数2c:进位数组ans:结果数组

intmain(){

//1.输入字符串

stringstr1,str2;

cinstr1str2;

len_a=str1.length();

len_b=str2.length();

//2."1,2,3,4"转换为{1,2,3,4},并且反转{4,3,2,1}

for(inti=0;istr1.size();i++)

a[str1.size()-1-i]=str1[i]-'0';

for(inti=0;istr2.size();i++)

b[str2.size()-1-i]=str2[i]-'0';

//3.找两个字符串最大的个数,目的是为了将每一位计算完

len_ans=max(len_a,len_b);

//4.相加(a+b)

for(inti=0;i=len_ans;i++){

ans[i]=a[i]+b[i]+c[i];//结果数组=(等于)被加数加上加数加上进位的数

if(ans[i]9){//如果结果数组大于9,则进位

c[i+1]=ans[i]/10;//给进位数组赋值

ans[i]%=10;//让结果数组大于9的数求余10,变成个位数

//5.如果结果数组len_ans位的数大于0,则让长度增加1

while(ans[len_ans]0)len_ans++;

//6.倒叙输出

for(inti=len_ans-1;ii--)coutans[i];

return0;

}

2.高精度减法

1.思路

定义被减数a,减数b,结果c数组输入被减数和减数,并且将数据倒叙存入数组中。找两个字符串最大的个数,目的是为了将每一位计算完将两个数组做相减(遍历至最大长度,避免有的数字没计算)。去掉前导0。例如结果为:089,不需要0循环遍历输出

2.代码

#includebits/stdc++.h

usingnamespacestd;

inta[510],b[510],c[510];//a:被减数b:减数c:结果

intmain(){

//1.输入字符串

stringstr1,str2;

cinstr1str2;

//2."1,2,3,4"转换为{1,2,3,4},并且反转{4,3,2,1}

for(inti=0;istr1.size();i++)

a[str1.size()-1-i]=str1[i]-'0';

for(inti=0;istr2.size();i++)

b[str2.size()-1-i]=str2[i]-'0';

//3.找两个字符串最大的个数,目的是为了将每一位计算完

intans=max(str1.size(),str2.size());

//4.相减(a-b)

for(inti=0;ians;i++){//遍历至最大长度,避免有的数字没计算

if(a[i]b[i]){

a[i+1]-=1;//向前借一位

a[i]+=10;//借一位以后加10

c[i]=a[i]-b[i];

//5.如去掉前导0。例如结果为:089,不需要0

while(c[ans-1]==0ans1)ans--;

//6.倒序输出

for(inti=ans-1;ii--)

coutc[i];

return0;

}

#includebits/stdc++.h

usingnamespacestd;

inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被减数b:减数c:进位ans:结果

intmain(){

//1.输入字符串

stringstr1,str2;

cinstr1str2;

len_a=str1.length();

len_b=str2.length();

//2."1,2,3,4"转换为{1,2,3,4},并且反转{4,3,2,1}

for(inti=0;istr1.size();i++)

a[str1.size()-1-i]=str1[i]-'0';

for(inti=0;istr2.size();i++)

b[str2.size()-1-i]=str2[i]-'0';

//3.找两个字符串最大的个数,目的是为了将每一位计算完

len_ans=max(len_a,len_b);

//4.相减(a-b)

for(inti=0;i=len_ans;i++){

ans[i]=a[i]-b[i]-c[i];//结果数组=(等于)被减数减去减数减去进位的数

if(ans[i]0){//如果结果数组小于0,则借位

ans[i]+=10;//借1位,加上10

c[i+1]++;//进位数组加1

//5.如去掉前导0。例如结果为:089,不需要0

while(len_ans1ans[len_ans-1]==0)len_ans--;

//6.倒序输出

for(inti=len_ans-1;ii--)coutans[i];

return0;

}

3.如果出现被减数的位数小于减数时呢

#includebits/stdc++.h

usingnamespacestd;

inta[510],b[510],c[510];//a:被减数b:减数c:结果

intflag=0;

intmain(){

//1.输入字符串

stringstr1,str2;

cinstr1str2;

//2.str1.size()str2.size()或者两个数一样长并且被减数的数值小于减数时,才需要交换两数位置

if(str1.size()str2.size()||str1.size()==str2.size()str1str2){

stringt=str1;

str1=str2;

str2=t;

flag=1;

//3."1,2,3,4"转换为{1,2,3,4},并且反转{4,3,2,1}

for(inti=0;istr1.size();i++)

a[str1.size()-1-i]=str1[i]-'0';

for(inti=0;istr2.size();i++)

b[str2.size()-1-i]=str2[i]-'0';

//4.找两个字符串最大的个数,目的是为了将每一位计算完

intans=max(str1.size(),str2.size());

//5.相减(a-b)

for(inti=0;ians;i++){//遍历至最大长度,避免有的数字没计算

if(a[i]b[i]){

a[i+1]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论