解题思路:
1: 1
2: 1 2 1
3: 1 2 1 3 1 2 1
4: 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
[1] [2] [3] [4] [5] [6] [7] [8] [9] ……
从例子中可以看出以下规律:
1、红色字体的数字左右两边出现的次数和顺序都一样
2、以第四组为例,下面中括号的数字表示的是操作的步数。
①、每一个盘子出现的间隔是一样的。如盘子1出现的步数是:1、3、5、7....。
盘子2出现的步数是:2、6、10....。
②、设题目给出的步数是P,则可以进一步发现 若 P%2 = 1,则可以知道出现在这一步的是盘子1.若P%4 = 2,则出现在这一步的是盘子2.若P%8 = 3,则出现在这一步的是盘子3.
从而推出P能被2整除的次数+1就是在第P步时出现的盘子。
#include <iostream>
#include <string>
using namespace std;
int getMode(string a,int b)
{
int temp = 0;
for(int i = 0;i < a.length();i++)
{
int t = temp * 10 + (a[i] - '0');
temp = t % b;
}
return temp;
}
string div(string a,int b)
{
string result = "";
int temp = 0;
for(int i = 0;i < a.length();i++)
{
int t = temp * 10 + (a[i] - '0');
temp = t % b;
result += (t / b + '0');
}
return result;
}
int cal(string s)
{
int count = 1;
while(1)
{
if(getMode(s,2) == 0)
{
count++;
s = div(s,2);
}
else
{
return count;
}
}
}
int main()
{
int cases;
int caseid = 0;
cin >> cases;
int count = cases;
while(cases--)
{
caseid++;
string s;
cin >> s;
if(caseid == count)
{
cout << "Case " << caseid << ": " << cal(s) << endl;
}
else
{
cout << "Case " << caseid << ": " << cal(s) << endl;
cout << endl;
}
}
return 0;
}