CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

微软计算器不管多大数,都能相乘,并显示,怎么做的?

楼主yz_hurrah(韧)2006-10-18 14:07:08 在 .NET技术 / C# 提问

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

1 楼aafshzj(生活需要breakthrough)回复于 2006-10-18 14:09:26 得分 0

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

2 楼xingyaohua(邢跃华)回复于 2006-10-18 14:10:03 得分 0

upTop

3 楼greatqn(一剑(随风飘飘天地任逍遥))回复于 2006-10-18 14:11:14 得分 0

以前看过一个算法,数值是用数组保存的。多大都由你自己啦。Top

4 楼lxhvc(lxhvc)回复于 2006-10-18 14:13:25 得分 0

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

5 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2006-10-18 14:16:53 得分 0

3.21e+60明显的是浮点数嘛Top

6 楼yz_hurrah(韧)回复于 2006-10-18 14:24:08 得分 0

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

7 楼myminimouse(坚决不用baidu)回复于 2006-10-18 14:27:53 得分 0

自己写用数组或字符串存可以做到Top

8 楼myminimouse(坚决不用baidu)回复于 2006-10-18 14:32:16 得分 0

算的时候是自己去处理的,并不是直接将两个数相乘.好象记得有人写过这样的方法,你可以搜一下Top

9 楼gchq(绿色超导)回复于 2006-10-18 14:32:27 得分 0

用数组,,,模仿笔算方法,,绝对可以的Top

10 楼yz_hurrah(韧)回复于 2006-10-18 14:33:35 得分 0

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

11 楼Muf(沐枫)回复于 2006-10-18 14:39:22 得分 0

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

12 楼yz_hurrah(韧)回复于 2006-10-18 14:44:56 得分 0

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

13 楼soft_df()回复于 2006-10-18 14:45:21 得分 0

呵呵,以前做过一个,就是速度慢点。Top

14 楼soft_df()回复于 2006-10-18 14:59:40 得分 0

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

15 楼yz_hurrah(韧)回复于 2006-10-18 16:58:00 得分 0

to   soft_df()   :   yzhurrah@163.com  
   
  多谢了!Top

16 楼soft_df()回复于 2006-10-19 07:58:37 得分 0

查收Top

17 楼ilovechao1314(有点晕了)回复于 2006-10-19 08:09:02 得分 0

大整数计算啊,呵呵Top

18 楼wisdomhxz(星尘缥缈)回复于 2006-10-19 08:20:55 得分 0

很基本的算法问题嘛.......  
   
  Top

19 楼myminimouse(坚决不用baidu)回复于 2006-10-19 08:28:32 得分 0

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

20 楼test33(隐姓埋名)回复于 2006-10-19 09:07:21 得分 0

路过。Top

21 楼Muf(沐枫)回复于 2006-10-19 10:00:12 得分 0

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

22 楼helloyou0(你好!)回复于 2006-10-19 10:00:53 得分 0

试试unix上的bc吧,看看谁更强Top

23 楼fd7893(看着办吧)回复于 2006-10-19 11:08:31 得分 0

很复杂,但并不难。Top

24 楼lousgood(动漫工作坊)回复于 2006-10-19 11:51:37 得分 0

我也想知道?Top

25 楼lovebanyi(风云)回复于 2006-10-19 11:53:07 得分 0

以前的计算报上有介绍.大数相乘..数据结构是要自己去定的/.Top

26 楼dyw31415926(守护)回复于 2006-10-19 13:00:22 得分 0

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

27 楼liangbch(宝宝)回复于 2006-10-19 14:47:49 得分 50

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

28 楼yz_hurrah(韧)回复于 2006-10-19 16:16:24 得分 0

没想到这么多同仁对这个主题感兴趣,呵呵。Top

29 楼free_wang()回复于 2006-10-19 18:35:09 得分 0

以前的计算报上有介绍.大数相乘..数据结构是要自己去定的/.Top

30 楼bjgzxx(食人一族)回复于 2006-10-19 18:45:52 得分 0

我做过一个计算器   太大的数不知道行不行   但是我的那个还能到30次幂吧Top

31 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-20 11:37:35 得分 0

哈哈哈,刚好我前段时间写了个大数运算的,还是带进制的,谁提供一个空间,我发过去  
  Top

32 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-20 11:38:47 得分 0

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

33 楼realside(最大的梦想,开启世界的API)回复于 2006-10-20 11:42:36 得分 0

以前写过,上万位数字的加减乘除,速度也不会很慢.Top

34 楼graydream()回复于 2006-10-20 12:02:49 得分 0

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

35 楼lovvver(ElephantTalk.Bright)回复于 2006-10-20 12:06:20 得分 0

这个东西算法很重要,都知道用数组来存放数字,还有一个需要注意的一点,就是,在对数据做运算的时候,如果能够用到现代数论的话,那么算法将非常简单,耗时也非常之短。比如:37*33,都是两位,首位相同,尾位和为10,那么结果就是:  
  首位*(首位+1)的结果与两数的尾位相乘的结果相接,即3*4=12,3*7=21,1221。  
  现代数论对大数相乘/除的处理非常简单快捷。Top

36 楼lovvver(ElephantTalk.Bright)回复于 2006-10-20 12:08:02 得分 0

上次在蚌埠,一些搞数论培训的人,在外面现场演练,写任意两个大数,来做乘法除法,不出10秒即得出答案。Top

37 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-20 12:37:46 得分 50

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

38 楼For_suzhen(不懂装懂)回复于 2006-10-20 13:01:24 得分 0

数组,或者字符串按位运算Top

39 楼alabaza(在我带他去面试之前,我给他的代码补上注释。因为写注释的程序员跟不写注释的程序员价钱相差很远。)回复于 2006-10-20 14:59:06 得分 0

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

40 楼fengfeiwuwq(寒烟翠)回复于 2006-10-20 15:36:49 得分 0

上次去面试的时候那个考官就出了这个题,可惜当时没有做出来,被定位到测试岗位,要是早点看到这里就好了!Top

41 楼vbinyan()回复于 2006-10-20 20:38:07 得分 0

我做的时候出现这些错误,不晓得是怎么回事?  
  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  
  这是怎么回事啊?唔唔。。。Top

42 楼vbinyan()回复于 2006-10-20 20:38:53 得分 0

哪位高人帮忙看看。。。  
  谢了哈Top

43 楼housisong(HouSisong)回复于 2006-10-20 23:18:36 得分 0

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

44 楼teatool(美貌与智慧并重,英雄与侠义的化身)回复于 2006-10-21 10:31:56 得分 0

int_256Top

45 楼SCHOLAR_II()回复于 2006-10-22 00:58:58 得分 0

这可不是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的朋友~  
  能多与我讨论~~SCHOLAR_II@163.COM~~  
  Top

46 楼vbinyan()回复于 2006-10-22 11:30:15 得分 0

英雄所见略同哦,我和楼上的思想比较像,而且乘法也是用二进制补码乘法的思想做的,已经快做好了,速度也蛮快Top

47 楼dirtysalt(李纳斯)回复于 2006-10-22 11:59:25 得分 0

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

48 楼peidun(床前明月光)回复于 2006-10-22 12:07:58 得分 0

以前作过求任意数阶乘的设计,我的做法是用链表存放结果的每一位数字;自认为大数相乘也可以这样做。Top

49 楼chaircat(chaircat)回复于 2006-10-22 13:15:05 得分 0

数论...高等代数...搞定...Top

50 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-22 15:12:55 得分 0

加法不仅仅只是加法,还要考虑减法,因为数分正负的  
  Top

51 楼lurenfu(具有中国特色的社会主义初级阶段,一百年不变)回复于 2006-10-22 15:13:13 得分 0

除法是最复杂的Top

52 楼housisong(HouSisong)回复于 2006-10-22 15:38:40 得分 0

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

53 楼TopXCS()回复于 2006-10-22 21:55:00 得分 0

dingTop

54 楼zhouyinhui(我也飘~~过)回复于 2006-10-22 23:11:42 得分 0

 
  老掉牙的问题了  
  以前用字符串做过,没有严格去考察速度的问题,不过我想也快不到哪里去。  
  如果那位有巧妙些的方法的话,麻烦贴贴哈Top

55 楼SailorXing(等待复苏...)回复于 2006-10-23 09:00:01 得分 0

是"相乘"吧!  
  主页链接怎么写成了"想乘",编辑水平真低!!!!!!Top

56 楼sonyicn(翻口皮)回复于 2006-10-23 09:35:56 得分 0

有意思,学习Top

57 楼Mittermeyer(疾风之狼)回复于 2006-10-23 11:24:32 得分 0

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

58 楼yz_hurrah(韧)回复于 2006-10-24 09:31:43 得分 0

这个问题能独立成一个板块了。Top

59 楼san_77227487()回复于 2006-10-24 19:49:24 得分 0

用两位表示小数点位置,其余99位用于存放数字。两个99位数相乘用小学生的计法:逐位乘。每次逐位乘用连加的方法。ok!明白否?Top

60 楼anrui32(命令提示符(anrui32@163.com))回复于 2006-12-06 22:04:07 得分 0

变体型Top

61 楼believefym(feng)回复于 2006-12-06 22:06:47 得分 0

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

62 楼partpass(咔咔)回复于 2006-12-06 22:12:14 得分 0

upTop

相关问题

关键词

得分解答快速导航

  • 帖主:yz_hurrah
  • liangbch
  • lurenfu

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo