【洛谷P1303A*Bprublem】
2019-03-04 09:53:12来源:博客园 阅读 ()
题目描述
求两数的积。
输入输出格式
输入格式:两行,两个数。
输出格式:积
输入输出样例
1 2
2
说明
每个数字不超过10^2000,需用高精
这道题还是比较良心的,毕竟在说明中提示了要用高精,那么就要我们用到高精的乘法算法,代码如下:
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<iomanip>//本蒟蒻习惯打上所有头文件; using namespace std; int main() { char a1[2001],b1[2001]; int a[2001]={},b[2001]={},c[200001]={},lena,lenb,lenc,i,j,x;//把a,b,c,数组清零,也可以用memset(a/b/c,0,sizeof(a/b/c));x代表进位数。 scanf("%s",a1); scanf("%s",b1);//对于洛谷的输入格式,用gets可能会卡bug。 lena=strlen(a1);lenb=strlen(b1);//计算a1、b1的长度,便于后面的循环和进位。 for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48; for(i=0;i<=lenb-1;++i) b[lenb-i]=b1[i]-48;//把字符数组中的数存在a、b数组中,可以像本代码中直接对字符进行计算,也可以用强制类型转换来转换。 for(i=1;i<=lena;++i)//外循环用于对第一个数的每一个数进行计算。 { x=0;//一定要记住把进位数在内循环内清零,否则将会出现意想不到的效果。 for(j=1;j<=lenb;j++)//内循环用于对第二个数的计算。 { c[i+j-1]=a[i]*b[j]+x+c[i+j-1];//把第i+j-1个数赋值,(至于为啥是第i+j-1个数,可以自己推一推,直接记住就行)它的值就是第一个数的第i位于第二个数的第j位之积加上进位的数(包括上一位进的数与上一个循环进的数)。 x=c[i+j-1]/10;//进位处理,取该数的进位数。 c[i+j-1]%=10;//保留个位数。 } c[i+lenb]=x;//将内循环没有进完的数进到下一个循环内。 } lenc=lena+lenb;//计算c数组的最大长度。 while(c[lenc]==0&&lenc>1)//c[lenc]==0是对0的判定,如果该位不是0,且满足lenc>1(希望有大神指点一下为什么要判定这个,我将这个去掉后也没有什么区别),就输出。 lenc--;//保证循环开始时不是0。 for(i=lenc;i>=1;i--)//循环输出c数组。 cout<<c[i]; cout<<endl; return 0;//好习惯别忘记。 }
高精乘法计算就是把我们平时用竖式做的乘法转化成更智障的算法,例如53*79:
5 3
x 7 9
2 7
+ 4 5
+ 2 1
+3 5
4 1 8 7
通过程序就可以处理10的n次方之间的乘法,真的很实用。
原文链接:https://www.cnblogs.com/juruohqk/p/10463035.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 洛谷P1164->小A点菜 2020-05-18
- 洛谷P1907口算练习题 2020-03-24
- 结题报告--P5551洛谷--Chino的树学 2020-03-13
- 结题报告--洛谷P3915 2020-03-13
- 洛谷P1034 矩形覆盖 2020-03-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash