1、解题思路:数论,打表素数,大数表示,大数除法。
2、注意事项:利用1000进制除法,如果用100、10000进制将会超时。
3、实现方法:(C++)
#include
<
iostream
>
#include < string >
#include < cmath >
using namespace std;
bool prime[ 1000010 ];
int ans[ 40 ];
void SetPrime()
{
memset(prime, 1 , sizeof (prime));
for ( int i = 2 ;i <= 1000 ;i ++ )
{
for ( int j = i;j * i < 1000001 ;j ++ )
prime[i * j] = false ;
}
}
int Translate( char ch[])
{
int len = strlen(ch);
int tmp,k;
if (len % 3 == 0 )
tmp = len / 3 ;
else
tmp = len / 3 + 1 ;
k = tmp;
for ( int i = len - 1 ;i >= 0 ;i -= 3 )
{
k -- ;
ans[k] = 0 ;
int t = 0 ;
for ( int j = i;j >= i - 2 && j >= 0 ;j -- )
{
ans[k] += (ch[j] - ' 0 ' ) * ( int )pow(( double ) 10 ,t ++ );
}
}
return tmp;
}
int Div( int prm, int len)
{
int tmp = 0 ;
int pre = ans[ 0 ];
for ( int i = 0 ;i < len;i ++ )
{
tmp = pre % prm;
pre = tmp * 1000 + ans[i + 1 ];
}
return tmp;
}
int main()
{
int L;
char K[ 110 ];
SetPrime();
while (cin >> K >> L)
{
if (K[ 0 ] == ' 0 ' && L == 0 )
break ;
int tmp = Translate(K);
int j = 2 ;
while ( 1 )
{
if (j >= L)
{
cout << " GOOD " << endl;
break ;
}
else
{
if (prime[j])
{
if (Div(j,tmp) == 0 )
{
cout << " BAD " << j << endl;
break ;
}
}
}
j ++ ;
}
}
return 0 ;
}
#include < string >
#include < cmath >
using namespace std;
bool prime[ 1000010 ];
int ans[ 40 ];
void SetPrime()
{
memset(prime, 1 , sizeof (prime));
for ( int i = 2 ;i <= 1000 ;i ++ )
{
for ( int j = i;j * i < 1000001 ;j ++ )
prime[i * j] = false ;
}
}
int Translate( char ch[])
{
int len = strlen(ch);
int tmp,k;
if (len % 3 == 0 )
tmp = len / 3 ;
else
tmp = len / 3 + 1 ;
k = tmp;
for ( int i = len - 1 ;i >= 0 ;i -= 3 )
{
k -- ;
ans[k] = 0 ;
int t = 0 ;
for ( int j = i;j >= i - 2 && j >= 0 ;j -- )
{
ans[k] += (ch[j] - ' 0 ' ) * ( int )pow(( double ) 10 ,t ++ );
}
}
return tmp;
}
int Div( int prm, int len)
{
int tmp = 0 ;
int pre = ans[ 0 ];
for ( int i = 0 ;i < len;i ++ )
{
tmp = pre % prm;
pre = tmp * 1000 + ans[i + 1 ];
}
return tmp;
}
int main()
{
int L;
char K[ 110 ];
SetPrime();
while (cin >> K >> L)
{
if (K[ 0 ] == ' 0 ' && L == 0 )
break ;
int tmp = Translate(K);
int j = 2 ;
while ( 1 )
{
if (j >= L)
{
cout << " GOOD " << endl;
break ;
}
else
{
if (prime[j])
{
if (Div(j,tmp) == 0 )
{
cout << " BAD " << j << endl;
break ;
}
}
}
j ++ ;
}
}
return 0 ;
}
4、程序实现:(Java)
import
java.math.
*
;
import java.util. * ;
public class Main
{
public static void main(String args[])
{
Solve slv = new Solve();
slv.Do();
}
}
class Solve
{
final int N = 1000000 ;
boolean [] tag = new boolean [N];
int [] prime = new int [N / 2 ];
String n;
int ans,l,cnt;
Scanner cin = new Scanner(System.in);
void Init()
{
int i,j;
for (i = 2 ;i < N;i ++ )
tag[i] = false ;
for (i = 2 ;i < N / 2 ;i ++ )
{
for (j = 2 ;i * j < N;j ++ )
{
tag[i * j] = true ;
}
}
cnt = 0 ;
for (i = 2 ;i < N;i ++ )
{
if (tag[i] == false )
{
cnt ++ ;
prime[cnt] = i;
}
}
}
boolean Check()
{
BigInteger bint = new BigInteger(n);
int t;
for (t = 1 ;t <= cnt && prime[t] < l;t ++ )
{
if (bint.remainder(BigInteger.valueOf(prime[t])).intValue() == 0 )
{
ans = prime[t];
return false ;
}
}
return true ;
}
void Do()
{
Init();
while ( true )
{
n = cin.next();
l = cin.nextInt();
if (l == 0 )
break ;
if (Check() == false )
System.out.println( " BAD " + ans);
else
System.out.println( " GOOD " );
}
}
}
import java.util. * ;
public class Main
{
public static void main(String args[])
{
Solve slv = new Solve();
slv.Do();
}
}
class Solve
{
final int N = 1000000 ;
boolean [] tag = new boolean [N];
int [] prime = new int [N / 2 ];
String n;
int ans,l,cnt;
Scanner cin = new Scanner(System.in);
void Init()
{
int i,j;
for (i = 2 ;i < N;i ++ )
tag[i] = false ;
for (i = 2 ;i < N / 2 ;i ++ )
{
for (j = 2 ;i * j < N;j ++ )
{
tag[i * j] = true ;
}
}
cnt = 0 ;
for (i = 2 ;i < N;i ++ )
{
if (tag[i] == false )
{
cnt ++ ;
prime[cnt] = i;
}
}
}
boolean Check()
{
BigInteger bint = new BigInteger(n);
int t;
for (t = 1 ;t <= cnt && prime[t] < l;t ++ )
{
if (bint.remainder(BigInteger.valueOf(prime[t])).intValue() == 0 )
{
ans = prime[t];
return false ;
}
}
return true ;
}
void Do()
{
Init();
while ( true )
{
n = cin.next();
l = cin.nextInt();
if (l == 0 )
break ;
if (Check() == false )
System.out.println( " BAD " + ans);
else
System.out.println( " GOOD " );
}
}
}