沿 3、5、7 从小到大依次检查整除,能整除就按顺序输出、空格分隔,一个都不行输出 n。
OJ: roj
题目 ID: 1047
难度:入门
标签:入门条件判断python
创建: 2026-09-29 16:10
更新: 2026-10-04 23:29
题目描述
给定一个整数,判断它能否被 3、5、7 整除:同时被三个整除输出 3 5 7;只被其中两个整除输出这两个数,小的在前;只被其中一个整除输出这个除数;都不能整除输出小写 n。
输入一行一个整数(可能为负数),输出一行按上述规则给出结果。
样例输入:
text
105样例输出:
text
3 5 7思路
把候选除数按 3、5、7 从小到大排好,依次检查 n % d == 0,能整除就直接输出并用空格分隔,"小的在前"由检查顺序自然保证,题面的四种情形统一成这一趟顺序检查。负数输入时余数符号跟随被除数,但"余数为 0"当且仅当整除,判据依然安全;一个都整除不了时输出 n。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 16:10
# update_at: 2026-09-29 16:10
import sys
DIVISORS = (3, 5, 7) # 候选除数,按从小到大排列:过滤出的顺序就是输出的顺序
def solve() -> None:
data = iter(map(int, sys.stdin.buffer.read().split()))
n = next(data) # 待判定的整数,可能为负数或 0
# 依次测试 3、5、7,能整除的按从小到大留下;负数取余结果仍非负,== 0 判定不受符号影响
divisors = [d for d in DIVISORS if n % d == 0]
# 空列表表示一个都整除不了,按题意输出 'n'
print(' '.join(map(str, divisors)) if divisors else 'n')
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-04 23:29
* update_at: 2026-10-04 23:29
*/
#include <cstdio>
typedef long long ll;
// 候选除数按 3、5、7 从小到大给出,沿这个顺序检查,能整除的直接输出,天然"小的在前"
ll divisors[3] = {3, 5, 7};
ll n; // 待判定的整数,可能为负数或 0
int main() {
scanf("%lld", &n);
// 用 flag 记录是否至少被一个数整除,决定最后要不要输出 'n'
bool flag = false;
for (int i = 0; i < 3; ++i) {
// 整除判据 n % d == 0:负数输入时余数符号跟随被除数,但"余数为 0"当且仅当整除,依然安全
if (n % divisors[i] == 0) {
if (flag) printf(" "); // 不是第一个输出的数,前面补一个空格
printf("%lld", divisors[i]);
flag = true;
}
}
// 一个都整除不了
if (!flag) printf("n");
printf("\n");
return 0;
}