void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

题目意思就是从2开始一次把其倍数的号码给踢掉,并且踢掉一次后对号码重新按1,2,3依次排序然后再次踢人

然后问你最后不被踢掉数的序列,第n个是几

刚开始我题目理解错了,以为是序列一直不边,就直接用筛法求出素数,然后压入一个数组,结果wa,后来才知道是踢掉后重拍了

既然重拍就设计一个标记数组,用来标记是否被踢掉

1 #include <stdio.h>
2  #define N 35000
3  int main(){
4  int arr[N]={0};
5  int lucky[N];
6  int i,j,k,n;
7 n = 0;
8 for (i=2;i<N;i++)
9 {
10 if(0 == arr[i]){
11 lucky[n++] = i;
12 //for(int j=i;j<N;j+=i)arr[j]=1;//筛法求素数
13 k = i+1;
14 j = 0;
15 while(k<N){
16 if(arr[k]==0){
17 j++;
18 }
19 if(i==j){
20 j = 0;
21 arr[k] = 1;
22 }
23 k++;
24 }
25 }
26 }
27 while (scanf("%d",&n)!=EOF&&n!=0)
28 {
29 printf("%d\n",lucky[n-1]);
30 }
31 return 0;
32 }
posted on 2011-04-14 23:40  void-man  阅读(177)  评论(0)    收藏  举报