微软计算器不管多大数,都能相乘,并显示,怎么做的?
按正常来说不管什么数据类型,都无法存放那么大的数据,怎么能做到的?
如果是很大的数的话,他会用“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




