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
的变化而动态调整,确保每个质因数都能正确地被分解和输出。