| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1327 人关注过本帖
标题:[原创] 南开的超级大数求和C++版
只看楼主 加入收藏
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
结帖率:33.33%
收藏
 问题点数:0 回复次数:4 
[原创] 南开的超级大数求和C++版
#include<iostream>
#include<cstring>
using namespace std;
class SupperNum
{
public:
    SupperNum();
    ~SupperNum();
    void Plus();    //接口与实现分离
    void dump() const;   //打印超级大数求和结果
    void scan();
protected:
    int get_a() const;  //超级大数a的长
    int get_b() const;  //超级大数b的长
    int get_sum() const;  //求和后的数的长
    enum{Maxsize=100};
private:
    void Core_Sum();  //核心函数
    char *a;
    char *b;
    char *sum;
    int flag;  //进位标志
};
SupperNum::SupperNum()
{
    a = new char[Maxsize+1];
    b = new char[Maxsize+1];
    sum = new char[Maxsize+2];
    flag = 0;  //不进位为0
}
SupperNum::~SupperNum()
{
    delete [] a;
    delete [] b;
    delete [] sum;
}
inline int SupperNum::get_a() const { return strlen(a); }
inline int SupperNum::get_b() const { return strlen(b); }
inline int SupperNum::get_sum() const { return strlen(sum); }
void SupperNum::dump() const
{
    int i;
    for(i=get_sum()-1;i>=0;i--)
        cout<<sum[i];
    cout<<endl;
}
void SupperNum::scan()
{
      cin>>a>>b;
}
void SupperNum::Plus()
{
    Core_Sum();
}
void SupperNum::Core_Sum()
{
    int s=-1;  
    int len=0;
    int i,j,k;
    if(get_a()>get_b())
    {
        b[len=get_a()] = '\0';
        for( i=get_a()-1,j=get_b()-1;i>=0;--i,--j)
             if(j>-1) b[i] = b[j];
             else b[i] = '0';
     }
    else
    {
        a[len=get_b()] = '\0';
        for(int i=get_b()-1,j=get_a()-1;i>=0;--i,--j)
             if(j>-1) a[i] = a[j];
             else a[i] = '0';
    }
    for(k=len-1;k>=0;--k)
    {
        if(a[k]-48+b[k]-48>=10)  //判断是否进位
        {
            if(flag == 1)   //判断是否连续进位
            {
                sum[++s] = (a[k]-48+b[k]-48)%10+49;
                flag = 1;
            }
            else
            {
                 sum[++s] = (a[k]-48+b[k]-48)%10+48;
                flag = 1;
            }
        }
        else     
        {   
            if(a[k]-48+b[k]-48==9)   //两数为9的特殊情况
            {
                if(flag==1)
                {
                    sum[++s] = (a[k]-48+b[k]-48+1)%10+48;
                    flag = 1;
                }
                else
                    sum[++s] = (a[k]-48+b[k]-48)%10+48;
            }
            else
            {
                if(flag == 1)
                {
                    sum[++s] = (a[k]-48+b[k]-48)%10+49;
                    flag = 0;
                }
               else
                    sum[++s] = (a[k]-48+b[k]-48)%10+48;
            }
        }
    }
     if(flag == 1) sum[++s] = 49;  
        sum[++s] = '\0';
}
int main()
{    
    SupperNum obj;
    obj.scan();
    obj.Plus();
         obj.dump();
    return 0;
}
搜索更多相关主题的帖子: 大数 南开 超级 求和 
2008-01-07 18:48
a19870502
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2007-10-31
收藏
得分:0 
看得不大懂~~~可以说说这个算法的意义吗?
2008-01-07 23:04
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
意思就是LZ写了一个大数运算类
2008-01-07 23:22
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
不过逐位运算效率比使用万进制要低2-3倍而已
2008-01-07 23:23
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
了解!!!!

樱花大战,  有爱.
2008-01-07 23:41
快速回复:[原创] 南开的超级大数求和C++版
数据加载中...
 
   



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

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