题目描述
问题描述 求出区间[a,b]中所有整数的质因数分解。
输入
输入两个整数a,b。
输出
每行输出一个数的分解,形如k=a1*a2*a3...(a1< =a2< =a3...,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
Conclude:
1.筛选出素数的方法
2.输出比较多,用cin,cout会超时,改用printf输出
输出格式的控制,尤其是*号的输出;
3.数组的重复利用,其实不需要memset;
#include <iostream> #include <cstring> using namespace std; int prime[10001]; int c[50]; void seekprime()//!!!!!!筛素数:原素乘以开方数 !!!!!! { for(int i=2;i<=10000;i++) { for(int j=2;j<=100;j++) if(i*j<=10000) prime[i*j]=0; } } %/
- 利用合数都是由若干个素数组成的,所以,我们可以将较小的素数找出来之后
- 然后将这个区间里面由这个素数组成的合数都去掉,就这样一直循环,直到没有
- 合数由最小的质数组成为止!
- void sushu()//素数为0,合数为1
- {
- int i=2,j;
- for(j=i*i;j<=9989899;j+=i)
- {
- prim[j]=1;
- }
- for(i=3;i<=3161;i+=2)//因为除2之外的偶数都是合数,所以将2另外考虑
- {//然后直接在奇数里面找就行了
- if(prim[i]) continue;
- for(j=i*i;j<=9989899;j+=i) //!!!i*i???!!!
- {
- prim[j]=1;
- }
- }
- }
%/
int main() { memset(prime,1,sizeof(prime)); seekprime(); int a,b; scanf("%d%d",&a,&b); for(int i=a;i<=b;i++) { if(prime[i]) printf("%d=%d\n",i,i); else { int l=i; int k=0; for(int j=2;j<=10000;j++) { if(prime[j]) { while(l%j==0) { l=l/j; k++; c[k]=j; } } if(l==1) break; } printf("%d=%d",i,c[1]); for(int q=2;q<=k;q++) printf("*%d",c[q]); printf("\n"); } } }