列表

详情


NC54623. 蕊蕊识数

描述

蕊蕊今年五岁了。她开始学习认识整数,因为一些数字非常大(足足有的规模!),因此蕊蕊想通过一些方法给数字“瘦身”,具体是这样操作的:每次蕊蕊将当前数字n的所有十进制位的数加起来,得到一个新的数,这样重复若干次直到这个数只有一位。这个过程中会产生若干个数,蕊蕊认为这些数都代表同一个数n。为了证明这一点,蕊蕊运用了自己刚刚学的除法的概念,她希望找到另一个整数m,使得要么这若干个数(包括n本身)都能被m整除,要么这若干个数(包括n本身)都不能被m整除。显然对于不同的n,m是不同的。并且蕊蕊希望让m尽可能的小,但是m必须大于1。你能够帮蕊蕊找到这样的数m吗?

输入描述

第一行一个整数,表示数据的组数。
接下来一共T行,第行表示第i组数据。每一个整数
数据保证输入的字符总量小于

输出描述

输出T行,第i行对应输入的第i组数据。每行一个正整数,表示对应的n的最小的m值(m>1)。

示例1

输入:

2
2
64

输出:

2
3

说明:

64可以被2整除,64“瘦身”一次后得到的10也可以被2整除,但将64“瘦身”两次后得到1不可以被2整除。而64,10,1都不能被3整除。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 140ms, 内存消耗: 3804K, 提交时间: 2019-12-05 07:29:55

#include<bits/stdc++.h>
using namespace std;
int main() {
	int T;
	cin >> T;
	int __max = 0;
	while (T--) {
		string str;
		cin >> str;
		int num = 0;
		for (auto &i : str)num += i - '0';
		int check = (str.back() - '0') % 2;//
		bool flag = true;
		while (num >= 10) {
			if (num % 2!= check){
				flag = false;
				break;
			}
			str = to_string(num);
			num = 0;
			for (auto &i : str) num += i - '0';
		}
		if (flag&&num % 2 == check)
			cout << 2 << endl;
		else
			cout << 3 << endl;
	}

	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 66ms, 内存消耗: 592K, 提交时间: 2022-11-03 23:46:12

#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
int _max = 0;
while (T--) {
string str;
cin >> str;
int num = 0;
for (auto &i : str) num += i - '0';
int check = (str.back() - '0') % 2;
bool flag = true;
while (num >= 10) {
if (num % 2 != check) {
flag = false;
break;
}
str = to_string(num);
num = 0;
for (auto &i : str) num += i - '0';
}
if (flag && num % 2 == check)
cout << 2 << endl;
else
cout << 3 << endl;
}
return 0;
}

C++ 解法, 执行用时: 49ms, 内存消耗: 612K, 提交时间: 2021-10-26 00:11:51

#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
int _max = 0;
while (T--) {
string str;
cin >> str;
int num = 0;
for (auto &i : str) num += i - '0';
int check = (str.back() - '0') % 2;
bool flag = true;
while (num >= 10) {
if (num % 2 != check) {
flag = false;
break;
}
str = to_string(num);
num = 0;
for (auto &i : str) num += i - '0';
}
if (flag && num % 2 == check)
cout << 2 << endl;
else
cout << 3 << endl;
}
return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 815ms, 内存消耗: 26244K, 提交时间: 2019-11-29 13:59:52

T = int(input())
while T:
    T -= 1
    n = input()
    check = int(n[-1]) % 2
    n = sum([int(i) for i in n])
    flag = True
    while n > 9:
        if n % 2 != check:
            flag = False
            break
        n = str(n)
        n = sum([int(i) for i in n])
    if flag and n % 2 == check:
        print(2)
    else:
        print(3)

Python3(3.5.2) 解法, 执行用时: 1001ms, 内存消耗: 6816K, 提交时间: 2020-01-04 20:09:04

t = int(input())
for _ in range(t):
    n = input()
    is_even = int(n[-1]) % 2
    n = sum(int(i) for i in n)
    flag = True
    while n > 9:
        if n % 2 != is_even:
            flag = False
            break
        n = sum(int(i) for i in str(n))
    print(2 if flag and n % 2 == is_even else 3)

上一题