Eeny Meeny Moo
- 题目描述
- 输入输出格式
- 输入格式
- 输出格式
- 输入输出样例
- 输入样例
- 输出样例
- 正确解法
- A C 代码
题目描述
你肯定有过这样的经验,那就是当很多一起使用网络的时候,网速变得很慢很慢。为了解决这个问题,德国的Ulm大学开发了一份意外事故计划,当发生意外事故的时候,先将第1个城市停电,然后再将第m+1个城市停电。循环访问城市1到n,n的下一个位置是1。在访问的过程中,对于已经停过电的城市不考虑,剩下的没停过电的城市每隔m个就要停一次电。例如:如果 n=17 并且 m=5,网络将按如下顺序断开:[1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7].
你的任务是写一个程序,读入城市的数目,然后求出m值,m值是使第2个城市刚好在最后才被停电的最小整数。
输入输出格式
输入格式
输入包括一行或多行,每一行仅包括一个整数n,满足3 <= n < 150, 代表城市的数目。输入以n为0时结束。
输出格式
对于输入的每一行,输出满足上述条件的最小m值。
输入输出样例
输入样例
3
4
5
6
7
8
9
10
11
12
0
输出样例
2
5
2
4
3
11
2
3
8
16
正确解法
由于数据量小,因此我们可以进行打表:
下面是用来打表的程序:
#include <bits/stdc++.h>
using namespace std;
int city[200],out;
int fin(int n)
{for (int i=2; i<=n; i++)if (city[i]==0)return i;
}
int main() {freopen ("a.txt","w",stdout);printf ("int a[200]={0,0,0");for (int n=3,k; n<=150; n++){out=1;for (k=2; out!=2; k++){memset (city,0,sizeof(city));for (int i=2,tt=1; i<=n; i++){for (int j=1; j<=k; j++){tt++;if (tt>n)tt=fin(n);if (city[tt]==1)j--;}city[tt]=1;out=tt;}}printf(",%d",k-1);}printf ("};");return 0;
}
它将会把数组保存到a.txt文本文档中。
A C 代码
根据上面的数组,我们可以得到正确的代码;
#include <bits/stdc++.h>
using namespace std;
int a[200]={0,0,0,2,5,2,4,3,11,2,3,8,16,4,21,6,5,2,11,20,34,8,15,10,7,13,11,13,45,18,23,8,3,2,25,75,42,13,5,23,13,50,16,18,89,38,8,39,30,29,38,7,45,23,137,46,63,17,48,5,46,34,140,33,39,2,28,29,79,33,48,3,10,46,120,6,37,17,8,44,15,160,20,35,144,104,179,153,24,8,265,19,9,62,7,139,19,44,93,182,27,158,185,193,17,82,3,11,43,55,21,41,146,29,80,59,8,29,66,19,160,59,28,129,127,120,72,45,157,2,63,127,81,318,513,98,28,32,231,236,411,26,45,5,303,228,66,9,205,65,39};
int n;
int main()
{while (scanf("%d",&n)){if (n==0)break;cout <<a[n] <<endl;}return 0;
}