上一篇博客中提到的是编程比赛的第一道题,还是比较容易的。第二道题就相对来说有些不容易想了。
题目要求(大概):
现有两个按钮,按下按钮N会执行2x+1,按下M执行2x+2。x初值为0,现要求出任意正整数n应使用何种按法使得x能变成n。
解法一:
我们猜想,是否任意给定一个数字都可以得通过按不同的按钮得到。可以使用穷尽法试试,便可以发现其中的规律。其实是可以通过任意一个数字找出其的顺序。那么我们可以倒着想:
- 如果n为偶数且n不等于0,则 按下了M ,执行 n = (n-2)/2;
- 如果n为奇数,则按下了N ,执行 n = (n-1)/2;
- 如果n为0,则逆序输出按下的按钮。
C语言实现:
#include <stdio.h>
int max(int a);
int min(int a);
int main(void){
int value;
scanf("%d",&value);
char ch[2000];
int flag = 0;
int k = 0;
while (value > 0){
if(value %2 == 0){
value = max(value);
ch[flag] = 'G';
flag++;
} else{
value = min(value);
ch[flag] = 'N';
flag++;
}
}
while (flag > 0){
printf("%c",ch[flag-1]);
flag--;
}
}
int max (int a){
int temp = (a-2)/2;
return temp;
}
int min (int a){
int temp = (a-1)/2;
return temp;
}