飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 1887|回复: 2

[C/C++] 关于大数乘法

[复制链接]

该用户从未签到

发表于 2009-9-22 00:48:42 | 显示全部楼层 |阅读模式
.

学习下小齐的代码 简单的雷构一个

纯模拟乘法运算了 未作任何优化

该雷人的代码仅作抛砖引玉 欢迎大家一起分享一些源码 共同提高

#include <string.h>
#include <stdlib.h>
#define MAX 100000

int main(int argc, char* argv[])
{
        void ShowNum(int * num,int len);
        int * num = (int *)malloc(sizeof(int)*100);
        memset(num,0,sizeof(int)*100);
        int len = num[0] = 1;       
        for(int i=2;i<=100;i++)
        {
                int temp = 0;
                for(int j=0;j<len;j++)
                {
                        num[j] = num[j]*i + temp;
                        temp = num[j] / MAX;
                        num[j] %= MAX;
                }
                num[j] += temp;
                if(num[j])
                        len++;
        }
        ShowNum(num,len);
        return 0;
}

void ShowNum(int * num,int len)
{
        if(!num[len])len--;
        printf("%d",num[len]);
        len--;
        for(int k=len;k>=0;k--)
        {
                printf("%05d",num[k]);
        }
        printf("\r\n");
}
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-9-22 00:50:27 | 显示全部楼层
经小齐授权 发一份小齐写的算法含部分优化(10倍数)的代码

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <windows.h>
#define MAX 100000

int condition(int n)
{
    if (n < 1)
    {
        printf("对不起,程序计算的范围之内 !\r\n") ;
        return 0;
    }
   
    if (n > 20000)
    {
        printf("别玩了,这么大的数算来也没什么用呀!\r\n") ;
        return 0;
    }
    return 1;
}

// count 后面零的个数
void display(int *p, int len, int count)
{
    int     i = len - 1;
    printf("%d", *(p+i)) ;
    for (i--; i >= 0; --i)
    {
        printf("%05d", *(p+i));
    }
    for (i = 0; i < count; ++i)
    {
        printf("0") ;
    }
    printf("\r\n");
}


int getLen(int n)
{
    int     i,
            len ;
    double  bit = 1.0 ;
   
    for (i = 1; i <= n ; ++i)
    {
        bit += log10(i) ;
    }
    // 一位整形保存5位,所以除5,多加二位,防止溢出
    len = (int)bit / 5 + 2;
    return len ;
}

void compute(int n)
{
    int     i ,
            j ,
            k  ,
            len,
            size,
            count,
            state;
    int     *p ;
    DWORD   begin = GetTickCount() ;
   
    size = getLen(n) ;
    p = (int *)malloc(sizeof(int)*size) ;
    memset(p, 0, sizeof(int)*size) ;
    p[0] = len = 1 ;
    count = 0;
    //state = 0 ;
    begin = GetTickCount() ;
    for (i = 2; i <= n; ++i)
    {
        // 优化10的倍数,如果是10的话,不参加运算,直接count+1
        // 也可以自己取出2、5来配对减少乘的次数
        state = 0;
        for (k = i; k % 10 == 0 && k >= 10; k /= 10)
        {
            ++count ;
        }
        if (k == 1)
        {
            continue;
        }
        for (j = 0; j < len; ++j)
        {
            p[j] = p[j] * k + state;
            state = p[j] / MAX ;
            p[j] %= MAX ;
        }
        p[j] += state ;
        if (p[len])
        {
            ++len;
        }
        if (len >= size)
        {
            printf("OverFlow!\r\n") ;
            return ;
        }
    }
    display(p, len, count) ;
    free(p) ;
    printf("used time: %ld ms\r\n", (GetTickCount() - begin)) ;
}

int main(int argc, char **argv)
{
    int n;
   
    while (scanf("%d", &n) > 0 && condition(n) == 1)
    {
        compute(n) ;
    }
    return 0;
}
PYG19周年生日快乐!

该用户从未签到

发表于 2009-9-22 12:02:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表