PAT :计算机程序设计能力考试:一个高校编程学习赛,内容基础,据说题目描述含糊不清,造成诸多理解错误。
第一观感是:输入输出样例极少,未给学生充分理解题目,提供更多辅助。
PAT 乙级:只涉及基础编程,最难到排序算法。适合基础语法学习阶段的同学。
问题描述
如果某个数 K K K 的平方乘以 N N N 以后,结果的末尾几位数等于 K K K,那么就称这个数为“N-自守数”。例如 3 × 9 2 2 = 25392 3×92^2 =25392 3×922=25392,而 25392 25392 25392 的末尾两位正好是 92 92 92,所以 92 92 92 是一个 3-自守数。
本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。
输入格式
输入在第一行中给出正整数 M ( ≤ 20 ) M(≤20) M(≤20),随后一行给出 M M M 个待检测的、不超过 1000 的正整数。
输出格式
对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的
N
N
N 和
N
K
2
NK^2
NK2 的值,以一个空格隔开;否则输出 No
。注意题目保证
N
<
10
N<10
N<10。
输入输出样例
输入样例1
3
92 5 233
输出样例1
3 25392
1 25
No
样例解释:无。
题解 1
思路分析:
- 获取 K K K 的位数,用于获取 N K 2 NK^2 NK2 的后几位,与 K K K 比较;
- 循环
N
N
N 的值,若是找到满足的
N
N
N 则置
flag
为true
,否则,依然为false
; - 根据标志
flag
的值,按格式输出结果。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int m;
cin >> m;
while(m--) {
int k;
cin >> k;
int len = 0;
if(k > 0 && k < 10) len = 1;
else if(k > 9 && k < 100) len = 2;
else if(k > 99 && k < 1000) len = 3;
int n;
bool flag = false;
for(n = 1; n < 10; n++) {
if((k * k * n) % (int)pow(10, len) == k) {
flag = true;
break;
}
}
if(flag) cout << n << " " << k * k * n << endl;
else cout << "No" << endl;
}
return 0;
}