试题 分解质因数
蓝桥杯练习系统 - 基础练习VIP试题 BASIC-16
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
解题思路
一、概念
- 素数:一般指质数,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。来源:质数_百度百科
- 合数:是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数。与之相对的是质数,而1既不属于质数也不属于合数。最小的合数是4。其中,完全数与相亲数是以它为基础的。来源:合数(数字分类基础概念)_百度百科
- 质因数分解:一般指分解质因数,每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。来源:分解质因数_百度百科
关键字:质数分解, 循环
代码如下
#include<iostream>
using namespace std;
bool PD[10000]; //无论a,b最大不大于10000
int main(){
int a,b;
cin>>a>>b;
for(int i=2;i<=b;++i) //开始假设从2开始所有数都是素数
PD[i]=true;
for(int i=2;i<=b;i++) //每次将一个素数的所有倍数都标记为非素数
{
if(PD[i]) //只标记素数的倍数
for(int j=2*i;j<=b;j+=i)
PD[j]=false; //将素数i的倍数j标记为非素数,j=j+i
}
for(int i=a;i<=b;i++)
{
if(PD[i]) //如果是素数,直接输出
cout<<i<<"="<<i<<endl;
else //如果是非素数,
{
cout<<i<<"=";
int k=i;
for(int j=2;j<=b;j++) //从 2 开始对 k 不断取余
{
while(k%j==0)
{
cout<<j;
k=k/j;
if(k!=1) //当k不为1时可继续输出符号 *
cout<<"*";
}
}
cout<<endl; //每分解完一个非素数,就换行
}
}
return 0;
}
总结
若有误,感谢指出。