按正常来说不管什么数据类型,都无法存放那么大的数据,怎么能做到的?如果是很大的数的话,他会用“3.21e+60”的方式显示,怎么能做到这一点?

解决方案 »

  1.   

    用decimal好了,或者自己写一个大数类型。
      

  2.   

    这可不是decimal能做到的,通常大数计算并不采用数字类型,而是采用字符串的方式来处理结果。
      

  3.   

    什么数据类型都放不下,肯定放不下那么大的数。有谁有这方面的经验,共享一下吧,to greatqn:即使用数组保存的话,计算的时候肯定要转换为数据吧,不能字符串和字符串相乘吧,但是只要转化为字符,就会出现溢出的问题。
      

  4.   

    to myminimouse:有什么好的思路么,分享一下,怎么实现。
      

  5.   

    3.21e+60  这么屁点大的数字,双精度(double)就可以存了。
      

  6.   

    to Muf:我只是举例子而已,如果是+100000000000呢?就是大数算法。
      

  7.   

    我用vb6.0做了加、减、乘,没作除。
    要的留EMail。
      

  8.   

    to soft_df() : [email protected]多谢了!
      

  9.   

    c#:
    http://topic.csdn.net/t/20050531/15/4048803.html
    http://blog.tom.com/blog/read.php?bloggerid=91109&blogid=9937c/c++:
    http://www.blogcn.com/user59/vilmali/blog/28601505.html
      

  10.   

    不需要大整数。
    微软计算器,认真看一下,其有效数位还是挺有限的。估计也就是128bit甚至256bit的浮点或定点就可以表示了。
      

  11.   

    myminimouse(出来发帖,迟早要结的)
    c#:
    http://topic.csdn.net/t/20050531/15/4048803.html
    http://blog.tom.com/blog/read.php?bloggerid=91109&blogid=9937
    -----------------------------------------------------------
    很好,我已经将效果做出来了,不错
      

  12.   

    按照微软的说法,其数据的表示使用扩展精度,按我的理解,扩展精度应该是一种浮点格式。微软说,扩展精度至少可以达到32位十进制数,我的测试表明,最多可表示39位有郊数字。
       客观的说,在微软计算器中,性能很差,特别是数的绝对值较大时。不信,你计算一个10万的阶乘试试(这个计算复杂度并不高,我以前写的一个计算器计算同样的精度,速度是第7000多倍,我最新的阶乘计算器计算其所有位数也只需要4秒,郭先强写的阶乘计算器则更快).另一个速度慢的例子不断的计算平方: 你输入 3,接着不断的按(x^2)按钮,当按到18次以后,速度就很慢了。
      你可以自己实现一个大数运算,写的好的话,速度可以比微软的计算器快好多,目前,最好的大数运算库是GMP,它主要运行在unix下,开源项目(包括源码)。这个大数运算库是公认的运行最快的大数运算库,用它来计算100万位圆周率,在主流计算机上只需3秒,比大名鼎鼎的superPI 要快得多。
      

  13.   

    包括Add/Sub/Mul/Div/Mod/Pow等运算,还有进制转换的,为了方便表示,最大的进制为36,最小的进制只能是2了
      

  14.   

    1、使用unsigned char*存放数据
    2、使用double类型的存储方法
    3、然后使用位运算来完成计算任务这样效率比较高
      

  15.   

    to lovvver(www.notsoft.cn)
    我承认你说的搞数论的人,可以有很快的算法,算法是很重要,但一味地去追求算法未必是一件好事。在对时间要求很苛刻的情况下,可以用尽可能优化的算法去解决问题,有的应用(如加解密)为了追求速度,甚至设计专门的芯片去实现。加解密中就要用到大数运算,因此快速的大数算法是必要的,但是不是要钻到牛角尖里去了,你给出的37*33的例子没有代表性,因为大数的运算不是固定为两位,也没说要求首位相同,尾数和为十。要能计算出所有的情况,不是专门针对某种情况去做优化。
      

  16.   

    没有类似java.math.BigDecimal的类型么?
      

  17.   

    我做的时候出现这些错误,不晓得是怎么回事?
    main.obj : error LNK2005: "bool __cdecl add(char *,char *,char *)" (?add@@YA_NPAD00@Z) already defined in HugeInt0.obj
    main.obj : error LNK2005: "bool __cdecl sub(char *,char *,char *)" (?sub@@YA_NPAD00@Z) already defined in HugeInt0.obj
    main.obj : error LNK2005: "bool __cdecl mul(char *,char *,char *)" (?mul@@YA_NPAD00@Z) already defined in HugeInt0.obj
    这是怎么回事啊?唔唔
      

  18.   

    自己动手打造“超高精度浮点数类”:
    http://blog.csdn.net/housisong/archive/2005/11/08/525215.aspx
      

  19.   

    这可不是decimal能做到的,通常大数计算并不采用数字类型,而是采用字符串的方式来处理结果~~~~
    支持这种说法~~
    算法我没看过~~
    只是我有过这样的想法~
    同时编了初步算法~(当然是只个方向,错误的地方有的是)~~
    后来没编下去~好像没多大的意义~
    再说上课忙~还得自学JAVA~~
    下面给出我写的一个加法功能的例子~
    希望那位高手能接写完~
    #include<stdio.h>
    #include<string.h>
    #define MAXSIZE  64/*位数最高位*/typedef struct 
    {
      char string[MAXSIZE+1];/*存放天文数字*/
    int  bit;/*记录数字最高位的位置*/
    }BigNumber; /*自定义结构体*/BigNumber InitBigNumber()//初使化大数
    {
    BigNumber aBigNumber;
    char temp[MAXSIZE+1]; printf("输入数据:");/*输入的数字于字符串存放*/
    scanf("%s" , temp ); aBigNumber.bit = MAXSIZE-strlen(aBigNumber.string) + 1;/*最高数位*/
    for(int i = aBigNumber.bit, j = 0 ; i <= MAXSIZE; i++, j++ )/*循环存放数据*/
    {
    aBigNumber.string[i] = temp[j];
    }
    return aBigNumber;
    }int C_Change_D(char c)//将数据字符转换成数字
    {
    return (c - '0');
    }char D_Change_C( int x)//将数字转志数据字符
    {
    return (x +48);}BigNumber AddFunction(BigNumber a_BigNumber,BigNumber b_BigNumber)
    {
    int a = MAXSIZE - a_BigNumber.bit + 1;/*数位个数*/
    int b = MAXSIZE - b_BigNumber.bit + 1;/*数位个数*/ 
    if(a>b)
    {
    for(int i = MAXSIZE ; i >= b_BigNumber.bit; i-- )
    {
    int temp_1 = C_Change_D(a_BigNumber.string[i]);
    int temp_2 = C_Change_D(b_BigNumber.string[i]);
    temp_1 += temp_2;
    if(temp_1 >= 10)
    {
    temp_1 %=10;
    a_BigNumber.string[i-1] += 1;
    }            a_BigNumber.string[i]=D_Change_C( temp_1 );
    }
            
    return a_BigNumber;
    }
    else
    {
    for(int i = MAXSIZE ; i >= a_BigNumber.bit; i--)
    {
    int temp_1=C_Change_D(b_BigNumber.string[i]);
    int temp_2=C_Change_D(a_BigNumber.string[i]);
    temp_1 += temp_2;
    if(temp_1>=10)
    {
    temp_1 %= 10;
    b_BigNumber.string[i-1] += 1;
    }            b_BigNumber.string[i]=D_Change_C( temp_1);
    } return b_BigNumber;
    }
    }
    int main()
    {
        BigNumber a,b,c;    a=InitBigNumber();
    b=InitBigNumber(); printf("&\n");
    c=AddFunction( a,b );
    printf("###\n"); printf("%s\n",c.string);
    return 0;

    上面代码包含我的思想~就是化为字符串的处理~
    我个人觉得~如果做*法的话~
    得参照《计算机组成原理》所讲的计算二进制*法的原理去编~
    个人想法~
    不好意思~
    乱说了一通~~
    希望初学JAVA的朋友~
    能多与我讨论~~[email protected]~~
      

  20.   

    我写了一个包,verylong,可能对你会有作用
    其中verylong_demo.c是个主程序,调用其它的子程序http://www.mscenter.edu.cn/blog/Files/dirlt/verylong.zip
      

  21.   

    to lurenfu(别理我,烦着呢!) : 
      除法使用乘法实现(牛顿迭代法)只需要几行代码而已:)
      

  22.   

    http://community.csdn.net/Expert/topic/4764/4764660.xml?temp=.1320612发觉最近N多人问这个问题。
      

  23.   

    java有BigInteger BigDecimal,就能处理很大的数,估计ms的计算器也是用了类似的算法吧