to lovvver(www.notsoft.cn) 我承认你说的搞数论的人,可以有很快的算法,算法是很重要,但一味地去追求算法未必是一件好事。在对时间要求很苛刻的情况下,可以用尽可能优化的算法去解决问题,有的应用(如加解密)为了追求速度,甚至设计专门的芯片去实现。加解密中就要用到大数运算,因此快速的大数算法是必要的,但是不是要钻到牛角尖里去了,你给出的37*33的例子没有代表性,因为大数的运算不是固定为两位,也没说要求首位相同,尾数和为十。要能计算出所有的情况,不是专门针对某种情况去做优化。
没有类似java.math.BigDecimal的类型么?
我做的时候出现这些错误,不晓得是怎么回事? 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 这是怎么回事啊?唔唔
要的留EMail。
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
微软计算器,认真看一下,其有效数位还是挺有限的。估计也就是128bit甚至256bit的浮点或定点就可以表示了。
c#:
http://topic.csdn.net/t/20050531/15/4048803.html
http://blog.tom.com/blog/read.php?bloggerid=91109&blogid=9937
-----------------------------------------------------------
很好,我已经将效果做出来了,不错
客观的说,在微软计算器中,性能很差,特别是数的绝对值较大时。不信,你计算一个10万的阶乘试试(这个计算复杂度并不高,我以前写的一个计算器计算同样的精度,速度是第7000多倍,我最新的阶乘计算器计算其所有位数也只需要4秒,郭先强写的阶乘计算器则更快).另一个速度慢的例子不断的计算平方: 你输入 3,接着不断的按(x^2)按钮,当按到18次以后,速度就很慢了。
你可以自己实现一个大数运算,写的好的话,速度可以比微软的计算器快好多,目前,最好的大数运算库是GMP,它主要运行在unix下,开源项目(包括源码)。这个大数运算库是公认的运行最快的大数运算库,用它来计算100万位圆周率,在主流计算机上只需3秒,比大名鼎鼎的superPI 要快得多。
2、使用double类型的存储方法
3、然后使用位运算来完成计算任务这样效率比较高
我承认你说的搞数论的人,可以有很快的算法,算法是很重要,但一味地去追求算法未必是一件好事。在对时间要求很苛刻的情况下,可以用尽可能优化的算法去解决问题,有的应用(如加解密)为了追求速度,甚至设计专门的芯片去实现。加解密中就要用到大数运算,因此快速的大数算法是必要的,但是不是要钻到牛角尖里去了,你给出的37*33的例子没有代表性,因为大数的运算不是固定为两位,也没说要求首位相同,尾数和为十。要能计算出所有的情况,不是专门针对某种情况去做优化。
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
这是怎么回事啊?唔唔
http://blog.csdn.net/housisong/archive/2005/11/08/525215.aspx
支持这种说法~~
算法我没看过~~
只是我有过这样的想法~
同时编了初步算法~(当然是只个方向,错误的地方有的是)~~
后来没编下去~好像没多大的意义~
再说上课忙~还得自学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]~~
其中verylong_demo.c是个主程序,调用其它的子程序http://www.mscenter.edu.cn/blog/Files/dirlt/verylong.zip
除法使用乘法实现(牛顿迭代法)只需要几行代码而已:)