| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2139 人关注过本帖
标题:关于设计任意两个长正整数(小于80位)的加法函数add()和乘法函数mult(),并 ...
只看楼主 加入收藏
knight900706
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-10
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
关于设计任意两个长正整数(小于80位)的加法函数add()和乘法函数mult(),并求任意整数(≤58)的阶乘的问题
最近刚刚接触到这个,遇到了这个问题,其实本身算法个人觉得不难,但是因为要求的是用无符号整型或字符型数组存储任意长整数,超出了正常的存储范围,所以很困惑,希望各位能指点一下了,最好附上程序代码了。[注:使用C来写的,谢谢了]
搜索更多相关主题的帖子: 设计 正整数 
2011-08-10 14:13
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <string.h>

struct BigInt
{
    char bit[500];//最大500位整数
    int sign;//符号1位负数 0 位正数
    int nbit;//大数位数
};


void InPut(BigInt *p)//整理
{
    char *begin,*end;
    begin = p->bit;
    end = p->bit + strlen(p->bit)-1;
    int i = strlen(p->bit)-1;
    while(begin<=end)//将大数倒转并转为码存储
    {
        char temp = *begin - 48;
        *begin = *end - 48;
        *end = temp;
        begin++;end--;
    }
    for(;i>=0;i--)//计算实际位数
        if(p->bit[i])
            break;
    p->nbit = i+1;
}

void ForMat(BigInt *p)//整理大整数
{
    for(int i = p->nbit-1;i>=0;i--)
        if(p->bit[i])
            break;
    p->nbit = i+1;
}

void Multi(const BigInt *pa,const BigInt *pb,BigInt *pc)//乘法
{
    int i,j,k;
    if(pa->sign == pb->sign)//判断符号
        pc->sign = 0;
    else
        pc->sign = 1;
    for(i = 0;i<pb->nbit;i++)
    {
        int low = 0;//进位初始为0
        for(j = 0;j<pa->nbit;j++)
        {
            int pos = i+j;//计算第i+j为的结果
            int num = pb->bit[i]*pa->bit[j]+low;//临时结果加进位
            pc->bit[pos] += num%10;//当前位临时结果 可能会大于10
            low = num/10;//进位临时结果
          
            low += pc->bit[pos]/10;//进位最终结果
            pc->bit[pos] %= 10;//当前位最终结果
        }
        if(low)
            pc->bit[i+j] += low;//如果进位不为0 还要继续进位
    }
    pc->nbit = i+j+1;//结果位数
    ForMat(pc);
}
void OutPut(const BigInt *p)
{
    int i,j,k;
    if(p->nbit == 0)
    {
        printf("0\n");
        return;
    }
    if(p->sign)//符号位1 是负数
        printf("-");
    for(i = p->nbit-1;i>=0;i--)
        putchar(p->bit[i]+48);//把码转化成数
    printf("\n");
}

int main()
{
    char a[101] = {0};
    char b[101] = {0};
    BigInt zero = {0};
    BigInt b1 = {0},b2 = {0},b3 = {0};
    strcpy(b1.bit,"567456456");
    strcpy(b2.bit,"12345");
    InPut(&b1);
    InPut(&b2);
    Multi(&b1,&b2,&b3);
    OutPut(&b3);
    return 0;
}
/*
3453463453      res:119263751035385902
34534534
345345345345    res:18909991071872981900820
54756756756
5686574563456   res:32276182665043770698510336
5675856757856
567456456       res:7005249949320
12345
*/
加法自己写吧 底下是测试数据

                                         
===========深入<----------------->浅出============
2011-08-10 16:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你的注释是C++才有的,不符合要求啦。

授人以渔,不授人以鱼。
2011-08-10 16:26
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
  我一直用VC 6.0  习惯了 每次写两个 /* */麻烦

                                         
===========深入<----------------->浅出============
2011-08-10 16:28
knight900706
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-10
收藏
得分:0 
谢谢了- -
2011-08-11 09:01
knight900706
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-10
收藏
得分:0 
回复 4楼 laoyang103
不过我运行的时候直接就弹出数据了,这是怎么回事呢?
2011-08-11 09:07
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 6楼 knight900706
看代码呀  那不是已经把数据放到strcpy函数里面去了嘛

                                         
===========深入<----------------->浅出============
2011-08-11 09:14
knight900706
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-8-10
收藏
得分:0 
回复 7楼 laoyang103
哦哦,知道了~~~谢谢~~~~
2011-08-11 10:12
快速回复:关于设计任意两个长正整数(小于80位)的加法函数add()和乘法函数mult ...
数据加载中...
 
   



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

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