找新朋友 |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 2681 Accepted Submission(s): 1254 |
Problem Description
新年快到了,“豬頭幫協會”準備搞一個聚會,已經知道現有會員N人,把會員從1到N編號,其中會長的號碼是N號,凡是和會長是老朋友的,那麼該會員的號碼肯定和N有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你編程序幫會長計算出來。
|
Input
第一行是測試數據的組數CN(Case number,1<CN<10000),接着有CN行正整數N(1<n<32768),表示會員人數。
|
Output
對於每一個N,輸出一行新朋友的人數,這樣共有CN行輸出。
|
Sample Input
2 25608 24027 |
Sample Output
7680 16016 |
思路:
篩選法。對於n(如25608),用一個大小等於n的bool數組記錄是不是新朋友。
找出它所有因子x,並且把x的倍數全標記爲1.
最終標記爲0的就是新朋友
菜鳥級原創代碼,若有可提高指出歡迎指導
#include<stdio.h>
#include<string>
#define MAXN 32768
bool oldFriend[MAXN];
int main()
{
int n, m, ans;
scanf("%d", &n);
while (n--)
{
scanf("%d", &m);
ans = 0;
memset(oldFriend, 0, sizeof(oldFriend));
for (int i = 2; i <= m / 2; i++)
if (m%i == 0)
for (int j = i; j < m; j+=i)
oldFriend[j] = 1;
for (int i = 2; i < m; i++)
if (oldFriend[i])
ans++;
printf("%d\n", m-ans-1);
}
}
本題還可以通過歐拉函數求解,參考:
http://blog.csdn.net/gray_1566/article/details/24491811