12.因数分解
发表时间:2026-02-18 13:42:11 作者:孙自超
因数也叫约数,定义:整数a除以整数b(b≠0) 的商正好是整数(没有余数),我们就说b是a的因数。比如1,2,5,10都是10的因数,因为它们都能被10整除。
例题
设计交互程序,列举一个非0整数所有的因数。例如:输入8,输出1,2,4,8。输入14,输出1,2,7,14。
1.分析
通过题目分析,我们解题思路如下:
- 输入一个非0整数保存到变量N。
- 依次用1~N的整数去除变量N。
- 如果相除余数为0,说明这个数就是变量N的因数。
2.流程图
根据解题思路,画出流程图如下:
3.程序
根据流程图顺序,可写出实验代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,i;
cin>>N;
while(i<=N){
if(N%i==0)
cout<<i<<endl;
i+=1;
}
return 0;
}
N = int(input())
i = 1
while i<=N:
if(N % i == 0):
print(i)
i = i+1
4.优化
通过流程图和代码的分析,如果输入整数是10,那程序就要循环10次,进行10次比较。如果整数是10000,循环次数就是10000。运行循环的次数与输入的N值相关。那有没有可以减少循环次数的方法呢?答案是肯定的,我们看下面这流程图。
大家看明白优化原理了吗?能算出优化后程序循环次减少多少吗?
5.优化后代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,i;
cin>>N;
while(i<=N/2){
if(N%i==0){
cout<<i<<endl;
cout<<N/i<<endl;
}
i+=1;
}
return 0;
}
N = int(input())
i = 1
while i<=N//2:
if(N % i == 0):
print(i)
print(N//i)
i = i+1
思考:为什么第4,8两行代码用N//2而不是N/2?
练习
把本节课例子用for语句改写。