| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1215 人关注过本帖, 2 人收藏
标题:大数乘法!求验证和优化!
取消只看楼主 加入收藏
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
结帖率:100%
收藏(2)
已结贴  问题点数:100 回复次数:5 
大数乘法!求验证和优化!
   




    废话不说    先贴代码:
程序代码:
#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 编辑 ]
搜索更多相关主题的帖子: 优化 
2012-03-01 16:17
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
回复 2楼 有容就大
GCC!
VC 6  回头我试下    程序中间输出了提示信息  估计有点乱!

不管怎么走、总有一个终点...
2012-03-01 17:06
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
回复 2楼 有容就大
改过了
原因是   VC6下面申请的整形数组  好像必须初始化  不然都是 不确定的值  不像GCC下都是0

不管怎么走、总有一个终点...
2012-03-01 17:33
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
回复 4楼 laoyang103
那也就是说     需要加上   范围判断是不?
根据不同的情况  使用不同的方式?

不管怎么走、总有一个终点...
2012-03-01 17:34
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
今天回去我再琢磨琢磨吧!明天来给大家结贴!

不管怎么走、总有一个终点...
2012-03-01 17:45
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
回复 10楼 laoyang103
多谢版主帮忙!
I‘ll be go on!

不管怎么走、总有一个终点...
2012-03-02 09:27
快速回复:大数乘法!求验证和优化!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035029 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved