| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2552 人关注过本帖, 1 人收藏
标题:超长整数的乘法
只看楼主 加入收藏
andyzhshg
Rank: 2
等 级:论坛游民
帖 子:111
专家分:20
注 册:2007-9-1
收藏(1)
 问题点数:0 回复次数:2 
超长整数的乘法
////////////////////////////////////////////////////////////////////////////////////
/*
                                 超长整数的乘法
本程序用于计算超过long型整数范围的超长整数的乘积,比如两个300位的整数相乘。
*/
////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>

#define MAX 500

void WorkOut(char a[], char b[]);

int main()
{
    char a[MAX], b[MAX];
    int i = 0;   
    printf("本程序用于计算大数乘法,当输入的乘数和被乘数均为零时退出程序:\n");
    while (1)
    {
        printf("输入被乘数:");
        scanf("%s", &a);
        printf("输入乘数:");
        scanf("%s", &b);

        if (a[0] == '0' && b[0] == '0')
            break;
        WorkOut(a, b);        
    }
    return 0;
}

void WorkOut(char a[], char b[])
{
    char result[MAX*2], carry, caculate[MAX*2], temp;
    int i, j, k;
    int tailA, tailB;
    
    //将每位的字符指转换成相应的数字值,并将顺序反置
    //caculate[]临时用作中间变量
    i = 0;
    while (a[i] != '\0')
    {
        caculate[i] = a[i] - '0';    //ASCII码转化成对应数字
        i++;
    }
    tailA = i - 1;
    for (i = tailA, j = 0; i >= 0; i--, j++)
        a[j] = caculate[i];

    i = 0;
    while (b[i] != '\0')
    {
        caculate[i] = b[i] - '0';
        i++;
    }
    tailB = i - 1;
    for (i = tailB, j = 0; i >= 0; i--, j++)
        b[i] = caculate[j];
        
    //清零累加和数组
    for (i = 0; i <= MAX * 2 - 1; i++)
        result[i] = caculate[i] = 0;

    for (i = 0; i <= tailB; i++)
    {
        carry = 0;

        for (j = 0; j <= tailA; j++)
        {
            temp = b[i] * a[j] + carry;
            carry = temp / 10;    //carry存放放进位
            temp = temp % 10;     //temp存放当前位值

            if (temp + caculate[i+j] >= 10) //当前位相加大于10则进位
            {
                caculate[i+j] = (temp + caculate[i+j]) % 10;
                carry++;
            }
            else                            //当前位相加小于10
                caculate[i+j] = temp + caculate[i+j];
        }
        caculate[i+j] = carry;             //加上最高位进位
    }
   
    i = MAX * 2 - 1;
    while (caculate[i] == 0)
        i--;
    for (j = i, k = 0; j >= 0; j--, k++)    //反序并与数字之转换成相应ACCII码
        result[k] = caculate[j] + '0';
    result[k] = '\0';
    printf("乘积:%s\n", result);
}

///////////////////////////////////////////////////////////////////////////////////////
/*
我试着用WorkOut返回结果字符串的头指针,但是在main函数中输出时总是乱码,那位高手可以指点
一下啊。
*/
////////////////////////////////////////////////////////////////////////////////////////

大数乘法.rar (5.95 KB)
搜索更多相关主题的帖子: 整数 乘法 int MAX char 
2008-04-05 01:33
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
收下,看看

—>〉Sun〈<—
2008-04-25 19:24
快速回复:超长整数的乘法
数据加载中...
 
   



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

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