語言算法
簡單C語言算法:
/*TC2.0調試成功*/
#include "stdio.h"
#include "math.h"
/*判斷是否為素數*/
int IsPrime(long number);
/*判斷此數是否為超級素數函式*/
int IsSuperPrime(long number);
/*求100~9999之間所有的超級素數個數,和,及最大值*/
void main()
{
long spn = 0;
long spm = 0;
long sps = 0;
for( long i = 101; i<= 9997; i += 2)
{
if(IsSuperPrime(i)==1)
{
sps += i;
spn++ ;
spm = i;
}
}
printf("sum=%ld,Total=%d,Max=%d",sps,spn,spm);
getchar();
}
/*判斷是否為素數*/
int IsPrime(long number)
{
if(number==1)
{
return 0;
}
for(int j=2; j<=sqrt(double(number)); j++)
{
if(number%j==0)
{
return 0;
}
}
return 1;
}
/*判斷此數是否為超級素數函式*/
int IsSuperPrime(long number)
{
if(IsPrime(number)==1)
{
do{
number=number/10;
if(IsPrime(number)==0)
{
return 0;
}
}
while(number>=10);
return 1;
}
else
{
return 0;
}
}
最佳化思想
由於超級素數具有一個特點:
如果有一個數不是素數的話的那么就是非超級素數了,這樣判斷對於位數超級大的數的循環是非常大的:
可以採取的最佳化策略有:
判斷是不是偶數:如果在要判斷的數字裡面發現了"2","4","6","8","0"那么很明顯這個就不是超級素數了.
還有就是判斷是不是3的倍數:
有這么一個規律:當一個數的各個位數的和加起來是3的倍數的時候,那么這個數就是3的倍數.例如123(1+2+3=2*3),那么將這個數的各個位加起來就能夠實現3的判斷.
以上兩點最佳化:可以很大程度的減少判斷的複雜度.