- 注册时间
- 2007-12-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 92658
- 在线时间
- 小时
|
发表于 2008-4-24 14:47:14
|
显示全部楼层
快速搜索的源代码
这个问题相当于每次把数据在后面追加9个字符,与 HugeCalc 内部数据结构正好一致,
所以用 HugeCalc 中的 DecLShift() 函数,可以获得非常高的效率。
我写了一个代码,可以对楼主要求的两种类型的素数均可快速搜索,
机器强劲的朋友也许有望可打破当前的世界纪录 :- #include <stdlib.h>
- #include <stdio.h>
-
- #include "../../../HugeCalc_API/CppAPI/Include/HugeCalc.h" // 公共接口
- #include "../../../HugeCalc_API/CppAPI/Include/HugeInt.h" // 10进制系统
-
- #pragma message( "automatic link to ../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
- #pragma comment( lib, "../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
-
-
- int main( void )
- {
- #if 0
- const UINT32 tail = 234567891;
- CHugeInt test( 1 );
- #else
- const UINT32 tail = 891234567;
- CHugeInt test( 1234567 );
- #endif
- printf( "tail is '%u'\r\n", tail );
-
- HugeCalc::EnableTimer();
- HugeCalc::ResetTimer();
- UINT32 u32Repeat = 0;
- while( 1000 > ++u32Repeat )
- {
- test.DecLShift( 9 ) += tail;
-
- if ( test.IsPrime() )
- {
- printf( "%s\trepeat=%u\tdigits=%u\tOK!\r\n", HugeCalc::GetTimerStr( FT_HHMMSS_ms ), u32Repeat, test.GetDigits() );
- }
- else if ( u32Repeat % 20 == 0 )
- {
- printf( "%s\trepeat=%u\r\n", HugeCalc::GetTimerStr( FT_HHMMSS_ms ), u32Repeat );
- }
- }
- HugeCalc::EnableTimer( FALSE );
-
- return 0;
- }
复制代码 运行数据如下:tail is '891234567'
00:00:00.001 repeat=7 digits=70 OK!
00:00:00.019 repeat=20
00:00:00.172 repeat=40
00:00:00.490 repeat=60
00:00:01.645 repeat=80
00:00:03.244 repeat=100
00:00:06.986 repeat=120
00:00:11.262 repeat=140
00:00:20.644 repeat=160
00:00:30.800 repeat=180
00:00:44.765 repeat=200
00:01:07.357 repeat=220
00:01:29.514 repeat=240
00:02:10.580 repeat=260
00:02:53.391 repeat=280
00:03:52.707 repeat=300
在 4 分钟内,已算到近 3000 位。 |
|