数手指

2023年7月31日 | 分类: 【编程】

【题目】

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