还是大数运算,这次是乘法的。具体都写在代码里面了,就不多说。
/****************************************************************************************/
/* 大数运算篇——乘法 */
/* 56 分析:两个数相乘,最多不超过10的(2+2)次方,即最多4位数2+2 */
/* X 44 用乘数的每个数去乘被乘数,然后把同一列的数相加,即 */
/* 20 24 24+0=24 20 + 24 =44 20+0=20 */
/* 20 24 然后,大于十的进十位数,24留4进2 44+2=46,留6进4, */
/* 20 44 24 20+4=24留4进2 最后结果就是2464 */
/* 24 6 4 可以发现一个规律,两个相乘的数,从右往左数第0位与第二 */
/* 结果 2464 个数第0位,乘出来相加的列是第0列,第1位与第2位乘在第3列*/
/* 得出结论:第a列的数与第b列的数字想乘得出来的结果是在 */
/* 第a+b列里面相加的 */
/****************************************************************************************/
/*
具体问题:
1.如何存储与计算? 输入数据在字符数组中,计算的数据变到整型数组
2.上诉分析的6,是60,4是400,这里的处理?再转回字符数组
3.
//作者:fat pears 最近更新时间:2019.01.31
/*代码实现*/
#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
char num_1[N]={0},num_2[N]={0},result[N]={0}; //num用来存放输入的数据,date用来计算
int date_1[N]={0},date_2[N]={0},date_3[N+N]={0}; //date_3是暂存计算结果
int i,j,t;
printf("请输入第一个数:\n");
gets(num_1);
printf("请输入第二个数:\n");
gets(num_2);
//倒序赋值,把num中的数赋值到date中
for(i = 0;num_1[i]!='\0';i++)
{
date_1[strlen(num_1)-i-1] = num_1[i] - '0';
}
for(i = 0;num_2[i]!='\0';i++)
{
date_2[strlen(num_2)-i-1] = num_2[i] - '0';
}
//开始计算,遍历所有计算,按规律,第i个数与第j个数想乘结果是在第i+j中进行相加的
for(i = 0;i<strlen(num_1);i++)
{
for(j = 0;j<strlen(num_2);j++)
{
date_3[i+j] += date_1[i] * date_2[j];
}
}
//开始进位 从0开始,对10取余进商
for(i = 0;i<=strlen(num_1)-1+strlen(num_2)-1;i++)
{
date_3[i+1] += date_3[i]/10;
date_3[i] = date_3[i]%10;
}
//把计算好的date_3数据放入字符数组
for(i = 0;i<=strlen(num_1)+strlen(num_2)-1;i++)
{
result[strlen(num_1)+strlen(num_2)-1-i] = date_3[i] + '0';
}
//删除前面多余0
for(i = 0;;i++)
{
if(result[i] != '0')
{
t = i;
break;
}
}
for(;i<strlen(num_1)+strlen(num_2);i++)
{
result[i-t] = result[i];
}
result[i-t] = '\0';
printf("两数相乘的结果是:\n");
puts(result);
return 0;
}