(这道题花了我很久很久的时间,,,脑子不灵活。。)
两个数的乘法运算,说简单一点,就是将其中一个数分别用它的所有位数分别乘上另一个数,然后将这些数错位相加.
贴个比较蠢得方法,不建议看,直接看下面一个。但不是我写的,是网友的,看了一下他们基本上都是那种写fa。
#include<stdio.h>
#include<string.h>
char a[10000];
char b[10000];
char c[10000];
int main()
{
scanf("%s", a);
scanf("%s", b);
int a_len = strlen(a); //记录字符串a,b的长度
int b_len = strlen(b);
for (int i = 0; i < a_len / 2; i++)//按照惯例,翻转字符串 ,比如12345->54321
{
char temp;
temp = a[i];
a[i] = a[a_len - 1 - i];
a[a_len - 1 - i] = temp;
}
for (int i = 0; i < b_len / 2; i++)//按照惯例,翻转字符串
{
char temp;
temp = b[i];
b[i] = b[b_len - 1 - i];
b[b_len - 1 - i] = temp;
}
for (int i = 0; i < a_len; i++) //将字符换数字
a[i] -= 48;
for (int i = 0; i < b_len; i++)
b[i] -= 48;
int c_count = 0;
for (int i = 0; i < a_len; i++)
{
int jinzhi_add = 0; //加法的进位
int jinzhi_mul = 0; //乘法的进位
int jinzhi_sum = 0; //总的进位,也就是加法加乘法的进位
int z = i;
for (int j = 0; j < b_len; z++,j++)
{
int temp= (c[z] + (a[i] * b[j]) % 10 + jinzhi_sum) % 10;
jinzhi_mul = (a[i] * b[j]) / 10; //乘法的进位就是两个数相乘/10
jinzhi_add = (c[z] + (a[i] *b[j]) % 10 + jinzhi_sum) / 10;
jinzhi_sum = jinzhi_add + jinzhi_mul;
c[z] = temp;
}
while (jinzhi_sum > 0)
{
c[z++] = jinzhi_sum % 10;
jinzhi_sum /= 10;
}
c_count = z;
}
if (c[c_count - 1] != 0)
printf("%d", c[c_count - 1]);
for (int i = c_count - 2; i >= 0; i--)
printf("%d", c[i]);
return 0;
}
//下面这个代码非常简洁和完美
#include<iostream>
#include<cstring>
using namespace std;
char a1[50001], b1[50001];
int a[50001], b[50001], i, x, len, j, c[50001];
int main()
{
cin >> a1 >> b1;//读入两个数
a[0] = strlen(a1); b[0] = strlen(b1);//计算长度
for (i = 1; i <= a[0]; ++i)
a[i] = a1[a[0] - i] - '0';//将字符串转换成数字
for (i = 1; i <= b[0]; ++i)
b[i] = b1[b[0] - i] - '0';
for (i = 1; i <= a[0]; ++i)
for (j = 1; j <= b[0]; ++j)
c[i + j - 1] += a[i] * b[j];//按乘法
len = a[0] + b[0]; //原理进行高精乘
for (i = 1; i < len; ++i)
if (c[i] > 9)
{
c[i + 1] += c[i] / 10;
c[i] %= 10;
}//进位
while (c[len] == 0 && len > 1)
len--;//判断位数
for (i = len; i >= 1; --i)
cout << c[i];//输出
return 0;
}
有没看懂的可以评论区发言哦。