【题目】
一只手从大拇指数到小拇指,继续从小拇指数到大拇指,往返数时大小拇指不重复。请问当数到 999 时,落在哪个手指?
描述:
一只手从大拇指数到小拇指,继续从小拇指数到大拇指,往返数时大小拇指不重复。请问当数到数字 \(n\) 时,落在第 \(f\) 个手指?
输入:
任意正整数 \(n\)
输出:
落在第 \(f\) 个手指
样例输入:
999
样例输出:
3
【分析】
先绘制辅助图表:
1 2 3 4 5 1 1 2 3 4 5 2 9 8 7 6 ↲ 3 ↳ 10 11 12 13 4 17 16 15 14 ↲ 5 ↳ 18 19 20 21 6 25 24 23 22 ↲ 7 ↳ 26 ......
发现:
1. 除了第 1 位,之后数字呈有规律循环,以 4 为单位。
2. 奇数行第一位需要缺省;
3. 偶数行第五位需要缺省。
数理关系:
1. 当数到 1 时,即为指头1
2. 当数到 n 时,对 \((n-1)\) 取商 \((n-1)/4=x\)、取余 \((n-1)\%4=y\)
2.1 当商 \(x\) 为奇数时,手指位置:\(f=5-y\)
2.2 当商 \(x\) 为偶数时,手指位置:\(f=y+1\)
【代码】
#include"aio.h"
using namespace std;
void palm(){//数手指
long long n,f;
cin >> n;
if (n <= 5){
f = n;
}
else{
n -= 1;
if (((n / 4)%2) != 0){
f = 5 - (n % 4);
}
else{
f = (n % 4) + 1;
}
}
string o;
switch (f)
{
case 1:
o = "大拇指。";
break;
case 2:
o = "食指。";
break;
case 3:
o = "中指。";
break;
case 4:
o = "无名指。";
break;
case 5:
o = "小拇指。";
break;
}
cout << "现在你数到了" << o;
}
int main()
{
while (1){
palm();
}
system("pause");
return 0;
}
答案:当数到 999 时,落在中指。
【单词】
palm 手掌
number 数字
finger 手指
output 输出