Eeny Meeny Moo

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 
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 
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;
}

你可能感兴趣的:(C++专栏,c++)