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




    废话不说    先贴代码:
程序代码:
#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
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:10 
我用VC6运行的结果很混乱,貌似得不到正确的结果啊。你用的什么编译器?

梅尚程荀
马谭杨奚







                                                       
2012-03-01 16:51
icysky
Rank: 5Rank: 5
来 自:心灵世界
等 级:职业侠客
威 望:1
帖 子:172
专家分:399
注 册:2011-5-17
收藏
得分:0 
回复 2楼 有容就大
GCC!
VC 6  回头我试下    程序中间输出了提示信息  估计有点乱!

不管怎么走、总有一个终点...
2012-03-01 17:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:30 
如果是大数乘小数可以用十万进制 百万进制来优化  比如阶乘问题

如果是大数乘大数直接像小学生算乘法那样就行啦 没啥可优化的

                                         
===========深入<----------------->浅出============
2012-03-01 17:12
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
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:30 
送给楼主一道题吧   http://acm.hdu.   看看这个乘法是怎么优化的
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

 

Input
One N in one line, process to the end of file.

 

Output
For each N, output N! in one line.

 

Sample Input
1
2
3
 

Sample Output
1
2
6
程序代码:
#include<stdio.h>
void Fact(int n)
{
    int a[20000] = {1},f,i,j,len = 1;
    for(i = 2;i<=n;i++)
    {
        for(f = 0,j = 0;j<len;j++)
        {
            if(!(a[j] || f))continue;
            a[j] = a[j]*i + f;
            f = a[j]/100000;
            a[j] %= 100000;
        }
        if(f)a[len++] = f;
    }
    printf("%d",a[--len]);
    while(len--)printf("%05d",a[len]);
    printf("\n");
}
int main(void)
{
    int n;
    while(~scanf("%d", &n))
    Fact(n);
    return 0;
}



 

                                         
===========深入<----------------->浅出============
2012-03-01 18:10
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:5 
学习一下

最基础的往往是你最容易忽略的!
2012-03-01 18:14
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:20 
其实阶乘问题是个典型的大数乘小数    如果我们有个很长很长的整数 比如9999! 然后再让他乘上10000  

运算次数可想而知  上面的帖子已经把大数乘小数的代码给你了   按照你的说法还有个大数乘大数的  

看你的代码应该是按位相乘的  建议你处理一下边缘数据来这里  http://acm.tzc.  

验证下正确性

                                         
===========深入<----------------->浅出============
2012-03-01 19:34
快速回复:大数乘法!求验证和优化!
数据加载中...
 
   



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

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