找规律。。。之前愣是算错了结果找不出。。。。。
规律是(p为素数):
输入n,当n为1、2、4、p^k、2*p^k和2*p时,输出n-1,其余的均是1。。。
以下是代码:(雷同率很高。。。。)
- #include<cstdio>
#include<iostream>
using namespace std; -
const int M=100010;
bool prime[M];
int p[M],num;
void isprime()
{
int i,j;
num=0;
for(i=2;i<M;i++)
{
if(!prime[i]) p[num++]=i;
for(j=0;(j<num && i*p[j]<M);j++)
{
prime[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
}- bool testprime(int n)
{
for(int i=2;i*i<=n;i++)
if(n%i==0) return false;
return true;
} - int main()
{
int n;
int i,j;
isprime();
while(scanf("%d",&n)==1)
{
if(n<8 || testprime(n) || (n%2==0 && testprime(n)))
{
printf("%d/n",n==0?0:n-1);
continue;
}
else
{
int a=n;
for(i=1;i<9592 && n>=p[i];i++)
{
if(n%p[i]==0)
{
while(n%p[i]==0)
n/=p[i];
break;
}
}
if(n==2 || n==1)
printf("%d/n",a-1);
else
printf("1/n");
}
}
return 0;
}