【题目】
一只手从大拇指数到小拇指,继续从小拇指数到大拇指,往返数时大小拇指不重复。请问当数到 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 输出