首页 > 其他 > 详细

试题 基础练习 分解质因数

时间:2020-04-19 09:15:11      阅读:113      评论:0      收藏:0      [点我收藏+]

一.题目

问题描述
  求出区间[a,b]中所有整数的质因数分解。
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)
题目链接:
    http://lx.lanqiao.cn/problem.page?gpid=T57

二.解决

思路:

1.首先筛出素数(也即标记哪些数是素数,哪些不是):

   用prime数组的值标记素数,prime[i]=0表示:i为素数;prime[i]=1表示:i不为素数;

2.然后获得[a,b]中每个数的质因子乘积形式---把问题分解为小问题:得到x的质因子乘积形式

3.得到x的质因子乘积形式:

   用一个while循环(循环终止条件为得到x的质因子乘积形式,循环找质因子t(范围在2到x之间,而且要prime[t]==0),若t符合条件,则把t加到ans数组中(ans数组存x的所有质因子),同时改变x的值(x=x/t),此时判断x的值是否为1,如果为1,表示分解结束,输出x的质因子乘积形式,并且退出循环;否则,while循环继续。

 

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 #define maxn 10000
 8 int prime[maxn],ans[maxn];
 9 //ans数组存一个数的因子,prime[i]数组标记i不为素数  val=0表示i为素数,否则不为素数 
10 
11 int main(){
12     int a,b,count=0,x,num=0;
13     cin>>a>>b;
14     memset(prime,0,sizeof(prime));
15     memset(ans,0,sizeof(ans));
16     
17     for(int i=2;i<maxn;i++){ //筛出素数 
18         count=0;
19         for(int j=2;j<=sqrt(i);j++){
20             if(i%j==0){
21                 count++;
22             }
23             if(count>=1){
24                 prime[i]=1;break; //表示i这个数不是素数
25             }
26         }
27     }
28     
29     for(int i=a;i<=b;i++){
30         num=0;
31         memset(ans,0,sizeof(ans));
32         cout<<i<<"=";
33         x=i;
34         while(1){
35             for(int j=2;j<=i;j++){
36                 if((prime[j]==0)&&(x%j==0)){//表示j为素因子 
37                     x/=j;
38                     ans[num]=j;
39                     num++;
40                 }
41                 if(x==1) break;
42             }
43             if(x==1) break;
44         }
45         sort(ans,ans+num);//必须要对因子进行排序
46         for(int h=0;h<num;h++){
47             if(h!=num-1) cout<<ans[h]<<"*";
48             else cout<<ans[h]<<endl;
49         }
50     }
51     return 0;
52 } 

 

试题 基础练习 分解质因数

原文:https://www.cnblogs.com/Aiahtwo/p/12728933.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!