欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 高精度加法乘法

高精度加法乘法

2025/1/31 7:24:16 来源:https://blog.csdn.net/2303_79549479/article/details/145399083  浏览:    关键词:高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算,存储

高精度加法

建议多在纸上画画,梳理思路

代码实现

  • 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
  • 字符串转逆序数组

int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{a[n]=s1[i]-'0';//字符转数字n++;
}
for(int i=y-1;i>=0;i--)
{b[m]=s2[i]-'0';m++;
}
  • 数组相加

for(int i=0;i<(x>y?x:y);i++)//以最长的数组为基准{c[i]+=a[i]+b[i];if(c[i]>=10)        //注意进位{c[i+1]+=c[i]/10;c[i]=c[i]%10;}}
  • 逆序输出

if(c[(x>y?x:y)]!=0)           //注意进位输出
{cout<<c[(x>y?x:y)];
}
for(int i=(x>y?x:y)-1;i>=0;i--)//逆序输出
{cout<<c[i];
}

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串int a[250]={0};int b[250]={0};int c[250]={0};string s1,s2;getline(cin,s1);getline(cin,s2);
//字符串转逆序数组int x=s1.size();int y=s2.size();int n=0;int m=0;for(int i=x-1;i>=0;i--){a[n]=s1[i]-'0';n++;}for(int i=y-1;i>=0;i--){b[m]=s2[i]-'0';m++;}
//实现加法for(int i=0;i<(x>y?x:y);i++){c[i]+=a[i]+b[i];if(c[i]>=10){c[i+1]+=c[i]/10;c[i]=c[i]%10;}}
//输出if(c[(x>y?x:y)]!=0){cout<<c[(x>y?x:y)];}for(int i=(x>y?x:y)-1;i>=0;i--){cout<<c[i];}return 0;
}

高精度乘法

代码实现

  • 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
  • 字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{a[n]=s1[i]-'0';//字符转数字n++;
}
for(int i=y-1;i>=0;i--)
{b[m]=s2[i]-'0';m++;
}
  • 循环相乘并相加
for(int i=0;i<x;i++)//两层for循环
{for(int j=0;j<y;j++){c[j+i]+=a[i]*b[j];if(c[j+i]>=10)  //进位{c[j+i+1]+=c[j+i]/10;c[j+i]=c[j+i]%10;}}
}
  • 逆序输出

可以根据科学计数法相乘规律可知,x位整数乘以y位整数,不大于(x+y)位整数

int p=0;
for(int i=x+y-1;i>=0;i--)//确定位数
{if(c[i]!=0){p=i;break;}
}
for(int i=p;i>=0;i--)//逆序输出
{cout<<c[i];
}

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串int a[250]={0};int b[250]={0};int c[250]={0};string s1,s2;getline(cin,s1);getline(cin,s2);
//字符串转逆序数组int x=s1.size();int y=s2.size();int n=0;int m=0;for(int i=x-1;i>=0;i--){a[n]=s1[i]-'0';n++;}for(int i=y-1;i>=0;i--){b[m]=s2[i]-'0';m++;}
//乘法运算for(int i=0;i<x;i++){for(int j=0;j<y;j++){c[j+i]+=a[i]*b[j];if(c[j+i]>=10){c[j+i+1]+=c[j+i]/10;c[j+i]=c[j+i]%10;}}}
//逆序输出int p=0;for(int i=x+y-1;i>=0;i--){if(c[i]!=0){p=i;break;}}for(int i=p;i>=0;i--){cout<<c[i];}return 0;
}

烧脑,啊啊啊啊啊啊啊啊啊啊啊啊啊,窝不想思考,窝没有脑子哇哇哇

小应用

用高精度计算出 S=1!+2!+3!+⋯+n!S=1!+2!+3!+⋯+n!(n≤50n≤50)。

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x)        //乘法
{int g=0;for(int i=100;i>=0;i--){a[i]=a[i]*x+g;//进位g=a[i]/10;a[i]=a[i]%10;}
}
void qh()                //加法
{int g=0;for(int i=100;i>=0;i--){s[i]=s[i]+a[i]+g;//进位g=s[i]/10;s[i]=s[i]%10;}
}
void sc()                //输出
{int w;for(int i=0;i<=100;i++){if(s[i]!=0){w=i;break;}}for(int i=w;i<=100;i++)printf("%d",s[i]);
}
int main()
{scanf("%d",&n);s[100]=a[100]=1;for(int i=2;i<=n;i++){change(i);qh();}sc();return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com