题目链接https://vjudge.net/problem/HDU-1999
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
Output
如果n是不可摸数,输出yes,否则输出no
Sample Input
3 2 5 8
Sample Output
yes yes no
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int T,n;
static int[] m=new int[1000010];
static boolean[] book =new boolean[1010];
static void modata(){
for(int i=1;i<=500000;i++){ //关键代码段一个数的倍数的约数一定包含这个数
for(int j=2*i;j<=1000000;j+=i){
m[j]+=i;
}
}
for(int i=1;i<=1000000;i++){//如果存在相等,标记
if(m[i]>=2&&m[i]<=1000) book[m[i]]=true;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
Arrays.fill(book, false);
T=sc.nextInt();
modata();
while(T>0){
n=sc.nextInt();
if(book[n]==true) System.out.println("no");如果存在,可莫数
else System.out.println("yes");//不可摸数
T--;
}
}
}