AcWing 867. 分解质因数
题目叙述
给定 n个正整数 ai,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。
输入格式
第一行包含整数 n。
接下来 n行,每行包含一个正整数 ai。
输出格式
对于每个正整数 ai,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数,每个底数和指数占一行。
每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围
1≤n≤100,2≤ai≤2×109
输入样例:
2
6
8
输出样例:
2 1
3 1
2 3
直接上代码并解释吧:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n; // 输入要处理的测试案例数量
while (n--) {
int a;
cin >> a; // 输入每个测试案例中的整数 a
// 循环找出整数 a 的所有质因数及其指数
for (int i = 2; i <= a / i; i++) {
if (a % i == 0) {
int s = 0; // 记录质因数 i 的指数
// 计算质因数 i 的指数
while (a % i == 0) {
a /= i;
s++;
}
// 输出质因数 i 及其指数
cout << i << " " << s << endl;
}
}
// 如果 a 大于 1,说明剩余的 a 是一个大于 sqrt(a) 的质因数
if (a > 1) {
cout << a << " " << 1 << endl;
}
cout << endl; // 每个测试案例输出结束后打印空行
}
return 0;
}
这段代码用于分解一个整数 a 的质因数,并输出每个质因数及其指数。让我们逐句解析代码的每一部分:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n; // 输入要处理的测试案例数量
while (n--) {
int a;
cin >> a; // 输入每个测试案例中的整数 a
// 循环找出整数 a 的所有质因数及其指数
for (int i = 2; i <= a / i; i++) {
if (a % i == 0) {
int s = 0; // 记录质因数 i 的指数
// 计算质因数 i 的指数
while (a % i == 0) {
a /= i;
s++;
}
// 输出质因数 i 及其指数
cout << i << " " << s << endl;
}
}
// 如果 a 大于 1,说明剩余的 a 是一个大于 sqrt(a) 的质因数
if (a > 1) {
cout << a << " " << 1 << endl;
}
cout << endl; // 每个测试案例输出结束后打印空行
}
return 0;
}
代码解析:
-
头文件和命名空间:
#include<iostream> using namespace std;- 引入输入输出流的头文件
iostream,并使用std命名空间。
- 引入输入输出流的头文件
-
主函数
main():int main() { int n; cin >> n; // 输入要处理的测试案例数量 while (n--) { int a; cin >> a; // 输入每个测试案例中的整数 a // 循环找出整数 a 的所有质因数及其指数 for (int i = 2; i <= a / i; i++) { if (a % i == 0) { int s = 0; // 记录质因数 i 的指数 // 计算质因数 i 的指数 while (a % i == 0) { a /= i; s++; } // 输出质因数 i 及其指数 cout << i << " " << s << endl; } } // 如果 a 大于 1,说明剩余的 a 是一个大于 sqrt(a) 的质因数 if (a > 1) { cout << a << " " << 1 << endl; } cout << endl; // 每个测试案例输出结束后打印空行 } return 0; } -
输入处理:
int n; cin >> n;:输入要处理的测试案例数量。while (n--):循环处理每个测试案例,n--表示每处理完一个测试案例,n减少一次,直到所有测试案例都处理完毕。
-
质因数分解:
for (int i = 2; i <= a / i; i++):循环从 2 开始,直到i大于a的平方根为止,逐个检查a是否能被i整除。if (a % i == 0):如果a能被i整除,说明i是a的一个质因数。int s = 0;:初始化s为 0,用于记录质因数i的指数。while (a % i == 0):循环除以i,直到a不能被i整除为止,每除一次增加s,即质因数i的指数。cout << i << " " << s << endl;:输出质因数i及其指数。
-
剩余因数处理:
- 如果
a > 1,则说明剩余的a是一个大于其平方根的质因数,直接输出a及其指数为 1。
- 如果
-
输出格式:
cout << endl;:每个测试案例输出结束后打印一个空行,用于分隔不同的测试案例。
这段代码的作用是对多个整数进行质因数分解,并按照指定的格式输出每个整数的所有质因数及其指数。
疑问?a的值时刻在变化,是不是for循环的执行条件在不断变化?
在这段代码中,确实会有 a 的值发生变化,并且 for 循环执行的条件也会随着 a 的变化而动态调整。让我们详细分析一下这个过程:
for (int i = 2; i <= a / i; i++) {
if (a % i == 0) {
int s = 0;
while (a % i == 0) {
a /= i;
s++;
}
cout << i << " " << s << endl;
}
}
分析过程:
-
for循环条件:for (int i = 2; i <= a / i; i++):循环从i = 2开始,每次增加i,直到i大于a的平方根为止。a / i是for循环的终止条件,这意味着当i越来越大,a / i的值越来越小,直到小于等于i时结束循环。
-
a的值变化:- 在
for循环内部,会执行while (a % i == 0)的判断和操作。 - 如果
a % i == 0成立,表示i是a的一个质因数,然后进入while循环。 - 在
while循环中,不断执行a /= i;的操作,即将a除以i的结果赋给a,同时增加质因数i的指数s。 - 当
a % i != 0时,while循环结束,表示a不再能被i整除,即质因数i的所有因子都已经除尽了。
- 在
-
for循环条件动态调整:- 因为
a的值在while循环内部可能会改变,所以for循环的终止条件a / i会随着a的变化而调整。 - 如果在
for循环开始时,a能被i整除,那么在while循环执行完毕后,a的值会变为a / i的值,因此for循环的条件也会相应地更新。
- 因为
-
剩余因数处理:
- 如果
a最终大于 1,说明剩余的a是一个大于其平方根的质因数,直接输出a及其指数为 1。
- 如果
总结来说,这段代码是动态地处理整数 a 的质因数分解过程,确实涉及到 a 的值在循环中不断发生变化,同时 for 循环的执行条件也会根据 a 的变化而动态调整,确保每个质因数都能正确地被分解和输出。
浙公网安备 33010602011771号