目录
思路:
实现过程:
准备:
代码:
总结:
欢迎各位道友指出错误助我进步
思路:
提到大数相乘,的确让人很头疼,对于初学者来说,大数无法通过正常的输入输出表示,无法简便计算,甚至无法转化拼接。所以很多人在面对这些大数时找不到头脑。
所以我第一次思考这种问题时大致的思路是,把两个大数,从末尾开始,逐位相乘,结果通过存于一个数组(倒序存放),并进行进位计算,最后只要将数组输出即可。
实现过程:
准备:
通过日常生活中的观察可以发现,任意两个数相乘后位数不超过原来两个数位数之和,这一点发现正好弥补了数组不能用未知数定义的缺陷,也为代码中循环语句提供了一个准确的范围。
理论存在,实践开始!
代码:
//大数相乘 #include#include //要运用到memset,strlen两个函数 #include //定义一个宏变量M=10005 #define M 10005 char s1[M], s2[M]; int a[M], b[M], c[M]; int main() { int i, j, wie1, wie2, wie3; //判断输入内容是否为一个字符串 while (~scanf_s("%s%s", s1, s2)) { //sizeof为一个单目运算符不用特殊头文件 //memset用作给字符串或者指针初始化,在此意为将C中所有的字节换为‘0’ memset(c, 0, sizeof(c)); wie1 = strlen(s1); wie2 = strlen(s2); wie3 = wie2 + wie2; printf("s1的长度=%d s2的长度=%d", wie1, wie2); //一个简单的倒序 for (i = 0; i < wie1; i++) { a[i] = s1[wie1 - i - 1] - '0'; } for (i = 0; i < wie2; i++) { b[i] = s2[wie2 - 1 - i] - '0'; } //乘法运算 for (i = 0; i < wie1; i++) for (j = 0; j < wie2; j++) c[i + j] += a[i] * b[j]; for (i = 0; i <= wie3; i++) { if (c[i] >= 10) { c[i + 1] += c[i] / 10; c[i] %= 10; } } //去除多余的‘0’ i = wie3; while (c[i] == 0) i--; //判断结果是否为‘0’,逆序打印 if (i < 0) printf("0"); else { for (; i >= 0; i--) printf("%dn", c[i]); } } return 0; }
总结:
大数相乘的确很复杂,但是很多语言都能实现大数相乘,现在用C++,java实现较多,还有Python,每一种编程语言都有自己的优势,相较于他们来说,我认为C语言还是比较麻烦的,因为确实C中很多函数,代码要自己写,不像其他语言直接分装好直接用。
以上便是本次学习的分享和思考。



