总也调不好程序
明明算法对
但通不过编译 import Primes
readInt :: IO Int
readInt = readLn
parta p a n = fromIntegral \$ sum (take ((div n 3) + 1)(iterate (1000*) (10^(p-1)*a)))
partb p b n = fromIntegral \$ sum (take ((div n 3) + (p - 1)) (iterate (1000*) (100^(2-p)*b)))
partc p c n = fromIntegral \$ sum (take (div n 3) (iterate (1000*) (10^p*c)))
isczPrime n = [(ns, a, b, c) |
ns <- ,
let p = mod ns 3,
p /= 0,
let (aa, bb, cc) = if (p == 1) then (, ,) else (, , ),
a <- aa, b <- bb, c <- cc,
(a /= c) || (b /= c),
let pp = (parta p a ns) + (partb p b ns) + (partc p c ns),
isPrime pp
]
main = do
putStrLn "Input Digits: "
n <- readInt
print (isczPrime n)
100内的结果
[ 本帖最后由 无心人 于 2008-11-21 20:15 编辑 ]
100位内共有999个
其中,abcabc...abca 型的有536个,
abcabc...abcab 型的有463个,
总和为 999 个。
无心人的结果似乎有些问题,
居然含有 (4,1,1,2),而 1121 = 19 * 59
总数目也少了些。
对应代码
////////////////////////////////////////////////////////////////////////////
// 目的:搜索串珠素数(形如abcabc...a(ab)的素数)
// 设计:郭先强 ( gxqcn@163.com; HugeCalc@Gmail.com )
// 日期:2008-11-21
//
// Web: http://www.emath.ac.cn/
// BBS: http://bbs.emath.ac.cn/
//
//////////////////////////////////////////////////////////////////////////
// Project -> Setting -> C/C++ -> Code Generation --> Use run-time library:
// Win32 Debug: Debug Multithreaded DLL
// Win32 Release:Multithreaded DLL
#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" )
#define MAX_DIGITS 100
int main(int argc, char* argv[])
{
printf( "Call %s\n\n", HugeCalc::GetVer());
if ( HC_LICENSE_NONE == HugeCalc::GetLicenseLevel() )
{
printf( "\n警告:您未通过 HugeCalc.dll 的许可认证!" \
"\n解决方案可选下列方案之一:" \
"\n 一、请将本程序移动到“/CopyrightByGuoXianqiang/[../]”目录下运行;" \
"\n 二、或请在 HugeCalc.chm 中进行注册(一劳永逸)。" );
}
else
{
UINT32 n=0, a, b, c, s, count=0;
CHugeInt stepA(1001), stepB, stepC, p;
HugeCalc::EnableTimer();
HugeCalc::ResetTimer();
while(++n)
{
/* abcabc...abca 型*/
if ( 3*n + 1 > MAX_DIGITS )
{
break;
}
( stepC = stepA ).DecRShift( 2 );
for ( a=1, p=stepA; a<10; a+=2, ++p+=stepA )
{
for ( b=0, s=(n+1)*a; b<10; ++b, s-=n*9 )
{
for ( c=0; c<10; ++c, s+=n )
{
if ( 0!=(s%3) && p.IsPrime() )
{
printf( "%s\tNo.%u\t(digits,a,b,c)=(%u,%u,%u,%u)\t%s\n",
HugeCalc::GetTimerStr(), ++count, 3*n+1, a, b, c, (LPCTSTR)p );
}
p += stepC;
}
}
}
/* abcabc...abcab 型*/
if ( 3*n + 2 > MAX_DIGITS )
{
break;
}
stepB = stepA;
stepC.DecLShift( 1 );
stepA.DecLShift( 1 );
for ( a=1, (p=stepA)+=stepB; a<10; ++a )
{
for ( b=1, s=(n+1)*(a+b); b<10; b+=2, s-=n*8-2, ++p+=stepB )
{
for ( c=0; c<10; ++c, s+=n )
{
if ( 0!=(s%3) && p.IsPrime() )
{
printf( "%s\tNo.%u\t(digits,a,b,c)=(%u,%u,%u,%u)\t%s\n",
HugeCalc::GetTimerStr(), ++count, 3*n+2, a, b, c, (LPCTSTR)p );
}
p += stepC;
}
}
}
++stepA.DecLShift( 2 );
}
}
system( "pause" );
return 0;
}运行 2.38 秒即可输出全部结果。 :)
可能有模式错误
刚学这个
好多东西要问别人
呵呵
我再修改去 找到问题了
b的模式有问题
===============
在原帖处修改了 看不到你的新结果,
现在可一致了?
这个用 HugeCalc 运行肯定要快很多。 :)
我对比你结果对了
但我这里在优化的过程里
又产生了个问题
正找人问呢 我上面已经把程序改了
就是partb后面 起始数字是100^(2-p)*b
原来是10^(2-p)*b
马上把结果帖上去
优化后的问题还要等人回答呢
=========================================
一直在修改的优化一点的程序
加上被3整除后出现了类型推定错误
经人指点,做了点修改,搞定了
import Primes
readInt :: IO Int
readInt = readLn
parta p a n = fromIntegral \$ sum (take ((div n 3) + 1)(iterate (1000*) (10^(p-1)* toInteger a)))
partb p b n = fromIntegral \$ sum (take ((div n 3) + (p - 1)) (iterate (1000*) (100^(2-p)* toInteger b)))
partc p c n = fromIntegral \$ sum (take (div n 3) (iterate (1000*) (10^p* toInteger c)))
isczPrime n = [(ns, a, b, c, pp) |
ns <- ,
let p = ns \`mod\` 3,
p /= 0,
let (aa, bb, cc) = if (p == 1) then (, ,) else (, , ),
a <- aa, b <- bb, c <- cc,
(a /= c) || (b /= c),
let l = ns \`div\` 3,
((l + 1) * a + (l + p - 1) * b + l * c) \`mod\` 3 /= 0,
let pp = (parta p a ns) + (partb p b ns) + (partc p c ns),
isPrime pp
]
main = do
putStrLn "Input Digits: "
n <- readInt
print (isczPrime n)
[ 本帖最后由 无心人 于 2008-11-21 21:42 编辑 ] :lol
下面讨论通用形
最多10个不同数字
最大100位数字
最小等于不同数字个数加一