大数乘法!求验证和优化!
废话不说 先贴代码:
程序代码:
#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 编辑 ]