新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> We choose to study algorithmic problems,  not because they are easy,  but because they are hard.
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 算法理论与分析 』 → [讨论]用c实现大数类型 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 34120 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [讨论]用c实现大数类型 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客楼主
    发贴心情 [讨论]用c实现大数类型

    在java里有一个类BigInteger可以提供了对任意大(位数大)的整数的各种运算操作,现在想自己在c里实现一个有相同功能的类型以供喜欢用c的程序员使用。

    我初想了一下:首先应该建立一个数据类型用来保存大数,然后再定义该大数类型上的各种运算。但是因为比如在乘方运算的时候如果算法设计的不好的话感觉一个乘方运算会很慢,所以想跟大家讨论下。
    下面是我自己设想的数据结构和一些操作:
    ----------------------
    typedef unsigned char elemType;

    typedef struct BigInt{
          elemType num;             //存一位数字
          struct BigInt *next;       //指向下一位数字
    }BigInt, *BigInteger;
    ----------------------
    加法:
    有四个变量,分别申明如下:
    a            //被加数
    b           //加数
    sum       //和
    ar          //进位
    初值都为0;
    1。从被加数和加数中分别取一位数字(0-9)出来赋值给a和b;
    2。让a与b,ar相加,结果存放在sum中;
    3。如果sum的值大于a或b中任何一个数(说明没进位),ar置0;否则有进位,ar置1;
    4。如果被加数或加数中有一个的位数已经加完,则结束;否则继续1-3。

    加法示例:
    add("15", "16")
    第一趟:a=5, b=6, sum=1, ar=1
    第二趟:a=1, b=1, sum=3, ar=0
    结果:"31"。

    --------------------
    其他运算主要都是基于上述加法来实现的,因为各种运算都可以转化成“加”运算。
    下面介绍下乘法:
    n           //乘数
    product  //乘积
    初值都为0;
    n = 乘数
    for i: 0 to n
        product = add(product, 被乘数);

    乘法实例:
    mul("15"," 2")
    n=2
    product=0
    第一趟:add(0, "15")  product="15"
    第二趟:add("15", "15") product="30"
    第三趟:add("30", "15") product="45"

    ----------------------
    其他运算实现思路类似乘法。
    问题:在乘法里遇到一个问题就是“for i: 0 to n”里n肯定只能是c里提供的整型数据类型,所以这里有限制,还请大家讨论下如何解决?


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/8 13:28:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客2
    发贴心情 
    怎么看的人多,回的人少啊??大家一起交流下嘛。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/12 0:32:00
     
     northenstar 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:21
      积分:171
      门派:XML.ORG.CN
      注册:2005/9/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给northenstar发送一个短消息 把northenstar加入好友 查看northenstar的个人资料 搜索northenstar在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看northenstar的博客3
    发贴心情 
    你的数据结构一个空间存放一位数字,这样设计既浪费空间,时间效率也不高。可以考虑一个空间直接存放IntMAX的思路
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/28 8:51:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客4
    发贴心情 
    我还考虑过用数组来存,但是输入的数字长度是随机的,所以用数组每次输入一个数据位的时候还要判断是否已经溢出,溢出的话还要重新扩充数组空间,也是不很好。

    顺便问下什么是IntMAX?

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/28 23:57:00
     
     waruqi 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:74
      门派:XML.ORG.CN
      注册:2005/11/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给waruqi发送一个短消息 把waruqi加入好友 查看waruqi的个人资料 搜索waruqi在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看waruqi的博客5
    发贴心情 
    不错

    ----------------------------------------------
    无限存,免费100G网络硬盘(强力推荐、绝对免费) 注册地址:(每天一次,不过可以通过删除cookies来重新注册) http://new.flashsave.com/web/get_reg.php?referid=129114

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/19 19:55:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客6
    发贴心情 
    现在加法和减法已经实现了,因为忙所以过久在做乘法和除法。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/21 23:24:00
     
     wxs1231 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:78
      门派:XML.ORG.CN
      注册:2006/2/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wxs1231发送一个短消息 把wxs1231加入好友 查看wxs1231的个人资料 搜索wxs1231在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wxs1231的博客7
    发贴心情 
    下面是我以前搞ACM时写过的大数类(希望对你有用):
    //大数类
    #include<iostream>
    #include<string>
    #include<iomanip>
    #include<algorithm>
    using namespace std;

    #define MAXN 9999
    #define DLEN 4

    class BigNum{
    private:
       int a[300];//DLEN digs for a position
       int len;
    public:
       BigNum(){len = 1;memset(a,0,sizeof(a));}
       BigNum(const int b);
       BigNum(const BigNum & T);

       bool     Bigger(const BigNum &) const;
       BigNum & operator=(const BigNum &);
       BigNum & Add(const BigNum &);
       BigNum & Sub(const BigNum &);
       BigNum operator+(const BigNum &) const;
       BigNum operator-(const BigNum &) const;
       BigNum operator*(const BigNum &) const;
       BigNum operator/(const int   &) const;
       void Print();
    };
    BigNum::BigNum(const int b)
    {
       int c,d = b;

       len = 0;
       memset(a,0,sizeof(a));
       while(d > MAXN){
          c = d - d / (MAXN + 1) * (MAXN + 1);
          d = d / (MAXN + 1);
          a[len++] = c;
       }
       a[len++] = d;
    }
    BigNum::BigNum(const BigNum & T) : len(T.len)
    {
       int i;
       memset(a,0,sizeof(a));
       for(i = 0 ; i < len ; i++)
          a[i] = T.a[i];
    }
    bool  BigNum::Bigger(const BigNum & T) const
    {
       int ln;
       if(len > T.len) return true;
       else if(len == T.len){
          ln = len - 1;
          while(a[ln] == T.a[ln] && ln >= 0) ln--;
          if(ln >= 0 && a[ln] > T.a[ln]) return true;
          else return false;
       }
       else return false;
    }
    BigNum & BigNum::operator=(const BigNum & n)
    {
       len = n.len;
       memset(a,0,sizeof(a));
       for(int i = 0 ; i < len ; i++)
          a[i] = n.a[i];
       return *this;
    }
    BigNum & BigNum::Add(const BigNum & T)
    {
       int i,big;

       big = T.len > len ? T.len : len;
       for(i = 0 ; i < big ; i++)
       {
          a[i] = a[i] + T.a[i];
          if(a[i] > MAXN)
          {
             a[i + 1]++;
             a[i] = a[i] - MAXN - 1;
          }
       }
       if(a[big] != 0) len = big + 1;
       else len = big;

       return *this;
    }
    BigNum & BigNum::Sub(const BigNum & T)
    {
       int i,j,big;

       big = T.len > len ? T.len : len;
       for(i = 0 ; i < big ; i++){
          if(a[i] < T.a[i]){
             j = i + 1;
             while(a[j] == 0) j++;
             a[j--]--;
             while(j > i) a[j--] += MAXN;
             a[i] = a[i] + MAXN + 1 - T.a[i];
          }
          else a[i] -= T.a[i];
       }
       len = big;
       while(a[len - 1] == 0 && len > 1) len--;
       return *this;
    }
    BigNum BigNum::operator+(const BigNum & n) const
    {
       BigNum a = *this;

       a.Add(n);
       return a;
    }
    BigNum BigNum::operator-(const BigNum & T) const
    {
       BigNum b = *this;

       b.Sub(T);
       return b;
    }
    BigNum BigNum::operator*(const BigNum & T) const
    {
       BigNum ret;
       int i,j,up;
       int temp,temp1;

       for(i = 0 ; i < len ; i++){
          up = 0;
          for(j = 0 ; j < T.len ; j++){
             temp = a[i] * T.a[j] + ret.a[i + j] + up;
             if(temp > MAXN){
                temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                up = temp / (MAXN + 1);
                ret.a[i + j] = temp1;
             }
             else {
                up = 0;
                ret.a[i + j] = temp;
             }
          }
          if(up != 0)
             ret.a[i + j] = up;
       }
       ret.len = i + j;
       while(ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len--;
       return ret;
    }
    BigNum BigNum::operator/(const int & b) const
    {
       BigNum ret;
       int i,down = 0;

       for(i = len - 1 ; i >= 0 ; i--){
          ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
          down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
       }
       ret.len = len;
       while(ret.a[ret.len - 1] == 0) ret.len--;
       return ret;
    }
    void BigNum::Print()
    {
       int i;

       cout << a[len - 1];
       for(i = len - 2 ; i >= 0 ; i--){
          cout.width(DLEN);
          cout.fill('0');
          cout << a[i];
       }
       cout << endl;
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/2/17 23:10:00
     
     yinbodotcc 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:88
      门派:XML.ORG.CN
      注册:2005/3/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yinbodotcc发送一个短消息 把yinbodotcc加入好友 查看yinbodotcc的个人资料 搜索yinbodotcc在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看yinbodotcc的博客8
    发贴心情 
    你的这种做法效率太低,很不合适
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/19 11:46:00
     
     binaryluo 帅哥哟,离线,有人找我吗?
      
      
      威望:6
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:679
      积分:5543
      门派:IEEE.ORG.CN
      注册:2005/2/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给binaryluo发送一个短消息 把binaryluo加入好友 查看binaryluo的个人资料 搜索binaryluo在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看binaryluo的博客9
    发贴心情 
    以下是引用yinbodotcc在2006-3-19 11:46:00的发言:
    你的这种做法效率太低,很不合适

    能说出你的想法吗??
    请不要说这种让人莫名的话。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/3/20 22:32:00
     
     Quasi_Algorithmist 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:60
      门派:XML.ORG.CN
      注册:2006/4/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Quasi_Algorithmist发送一个短消息 把Quasi_Algorithmist加入好友 查看Quasi_Algorithmist的个人资料 搜索Quasi_Algorithmist在『 算法理论与分析 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Quasi_Algorithmist的博客10
    发贴心情 
    我自己的+-* / 函数全编好啦,工作的很完美。下一步想编开方函数。

    不过我不在乎执行的速度,只是玩玩。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/21 16:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 算法理论与分析 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/10 15:03:58

    本主题贴数12,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    117.188ms