UVA11547 Automatic Answer 题解

Content

题面扯了一大堆空话。

真正的题意是:有 \(T\) 个询问,每次给出一个数 \(n\),求出 \((567n\div 9+7492)\times235\div47-498\) 的十位数。

数据范围:\(1\leqslant T\leqslant 100,-1000\leqslant n\leqslant 1000\)。

Solution

我们考虑把这个式子化简:

\((63n+7492)\times235\div47-498\)

\(=(63n+7492)\times5-498\)

\(=315n+37460-498\)

\(=315n+36962\)

所以,真正要求的东西就是这个式子:\(315n+36962\)。

那么如何求一个数的十位数呢?

很显然,设一个数是 \(x\),答案就是 \(|\left\lfloor\dfrac{x}{10}\right\rfloor\mod10|\)。

为什么?

因为在整除完 \(10\) 以后,得到的数就没有原来的数的个位数了,所以这时候再取模,相当于将前面所有的数位全部去除掉,只剩下我们要求的十位数。

特别注意负数的时候,因为十位数一定是一个非负整数,一定要取绝对值再去求。

所以,本题的答案就是 \(|\left\lfloor\dfrac{315n+36962}{10}\right\rfloor\mod10|\)。

Code

#include <cstdio>
#define abs(x) x < 0 ? -x : x 
using namespace std;

inline int g() {
	int f = 1, x = 0;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-')	f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

int main() {
	int T = g();
	while(T--) {
		int x = g();
		printf("%d\n", abs((315 * x + 36962) / 10 % 10));
	}
	return 0;
}
上一篇:2021-03-20


下一篇:最大整除子集 -- LeetCode -- 4.23