大数乘法!求验证和优化!
废话不说 先贴代码:
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 200
int main()
{
/*
* 1.定义游标i,j 其中i为乘数游标,j为被乘数游标
* 2.两个大数的位数big_num_1_length,big_num_2_length
* 3.结果循环输出非0标志 zero_use_flag
*/
int i,j;
int big_num_1_length,big_num_2_length;
int zero_use_flag =0;
/* 1.乘运算时每两个数组元素乘运算结果 per_multi_result
* 2.乘运算时每次进位大小 prev_large
* 3.乘运算时没行结果移位大小 move_large
* 4.最后结果运算时没位累加之和的大小 per_add_result
*/
int per_multi_result = 0;
int prev_large = 0;
int move_large = 0;
int per_add_result = 0;
/*
* 1.创建二维整形数组 multi_result 用于存储乘运算后的结果
* 2.创建两个一维字符数组 big_num_1 和 big_num_2 用于接收两个大数
* 3.创建一维整形数组 result 用于存储最终的计算结果
* 4.接收即将输入的大数
*/
int multi_result[NUM][NUM]={0};
char big_num_1[NUM] = {'0'};
char big_num_2[NUM] = {'0'};
int result[NUM+2] = {0};
gets(big_num_1);
gets(big_num_2);
/*
* 1.计算出两个大数的位数
* 2.循环相乘 外层循环为乘数 内层循环为被乘数
*/
big_num_1_length = strlen(big_num_1);
big_num_2_length = strlen(big_num_2);
for(i=big_num_1_length-1;i>=0;i--)
{
move_large = big_num_1_length-1-i;
for(j=big_num_2_length-1;j>=0;j--)
{
per_multi_result = ((int)big_num_2[j]-48) * ((int)big_num_1[i]-48);
//从第2行开始进行移位
multi_result[big_num_1_length-1-i][big_num_2_length-1-j+move_large] = (per_multi_result+prev_large)%10;
prev_large = (per_multi_result+prev_large)/10;
}
if(prev_large != 0)
{
multi_result[big_num_1_length-1-i][big_num_2_length-1-j+move_large] = prev_large;
prev_large = 0;
}
}
printf("输出每行的计算数据:\n");
for(i=0;i<big_num_1_length;i++)
{
for(j=0;j<big_num_2_length+big_num_1_length;j++)
{
printf("%d\t",multi_result[i][j]);
}
printf("\n");
}
/* 累加每行计算除的结果 */
printf("累加每列数据:\n");
prev_large = 0;
for(j=0;j<NUM;j++)
{
per_add_result = 0;
for(i=0;i<big_num_1_length;i++)
{
per_add_result += multi_result[i][j];
}
result[j] = (per_add_result+prev_large)%10;
printf("%d\t",result[j]);
prev_large = (per_add_result+prev_large)/10;
}
putchar('\n');
if(prev_large !=0)
result[j+1] = prev_large;
/* 输出运算结果 */
printf("反序输出,得最终结果:\n");
for(i=NUM+1;i>=0;i--)
{
if(zero_use_flag == 0)
{
if(result[i] != 0 )
{
printf("%d",result[i]);
zero_use_flag = 1;
}
}
else
printf("%d",result[i]);
}
return 0;
}思路:
位乘得出每一行
根据行数进行"移位" 比如说 第2行 那么改行存储从索引为1的数组单元开始存储
"矩阵"每列进位相加
反序输出得最终结果
希望大家帮我看看 思路有没有错 以及 有没有什么地方可以优化的地方!
不怕拍砖 只求指导!!!
先谢过了!
[ 本帖最后由 icysky 于 2012-3-1 17:32 编辑 ]








