HDU 2.1.6 找新朋友

找新朋友

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


發佈了48 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章