HDU 1286.找朋友(简单的筛选法)

/***********************

题目大意:找出1-N之间的素数(此题中1也算做素数)与N互素的数的个数,假设非互素素数的个数为num则输出N-num;

题目解析:先找出能整除N的数i,再运用筛选法先求出i小于N的倍数,再用a[j ]数组判断n与j不互素再用num计算与n不互素的数的个数,输出n-num;

易错分析:1. 应先判断a[j]是否是否应经赋值为1了,这样可避免多计算一次j;

               2.n/=i;i=2;可减少循环次数;

*************************/

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int t,n,n1,i,j,num,a[32770];
    scanf("%d\n",&t);
    while(t--)
    {
        scanf("%d",&n);
        n1=n;
        i=2;
        num=0;
        memset(a,0,sizeof(a));
        while(n>=i)
        {
           if(n%i==0&&!a[i])

          //仅对n的约数运用筛选法筛选,且对i还没有筛选的约数进行筛选;
           {
               for(j=i;j<=n1;j+=i)
                {
                    if(!a[j])

                  //先判断a[j]是否已经判断了,若还没判断num++;
                    num++;
                    a[j]=1;
                }
               n/=i;

              //减少循环次数;
               i=2;
           }
          i++;

        }
        printf("%d\n",n1-num);
    }
    return 0;
}


你可能感兴趣的:(ACM,杭电,1286.找朋友)