问题描述
求出区间[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
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
先筛出所有素数,然后再分解。
数据规模和约定问题描述
求出区间[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
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
2<=a<=b<=10000
拿到题目似曾相识,但题目要求构造素数表,看了一眼数据范围,要构建素数表也是有道理的,构建素数表的思路并不难,就是标记元素
标记与当前数有关的所有倍数,自然就剩下了所有素数,不方便就在于函数构建时的正确引用,和全局变量,局部变量的设定。然后就是把所有被标记的素数都存到另一个数组中,最后构造一个函数求单个数的分解式;
代码实现:
1 #include<stdio.h> 2 #include<math.h> 3 #define N 10000 4 int isprime[N+1],prm[N/5]; 5 void prime(int isprime[],int n) 6 { 7 int i; 8 for(i=0;i<=n;i++) 9 isprime[i]=1; 10 isprime[0]=isprime[1]=0; 11 int k=sqrt(n); 12 for(i=0;i<=k;i++)//所有可能产生的因子,在k之前而倍数则可以在其之后。 13 { 14 if(isprime[i]==1) 15 { 16 for(int j=2*i;j<=n;j+=i)//除去所有素数的倍数即可。 17 isprime[j]=0; 18 } 19 } 20 } 21 void ssb(int n,int prm[],int *num) 22 { 23 int i,k; 24 25 prime(isprime,N);//10000以内的所有素数均被置为1; 26 27 k=1; 28 for(i=0;i<=n;i++) 29 { 30 if(isprime[i]==1) 31 prm[k++]=i;//将素数存入另一个数组中; 32 } 33 *num=k;//运用指针的知识传入下一个函数; 34 } 35 void shuchu(int n) 36 { int prmnum; 37 38 ssb(N,prm,&prmnum);//地址中含有k; 39 printf("%d=",n); 40 41 int m; 42 m=n; 43 for(int i=1;i<prmnum&&m>1;i++) 44 { 45 while(m%prm[i]==0) 46 { 47 m=m/prm[i]; 48 printf("%d",prm[i]); 49 if(m!=1) 50 printf("*"); 51 } 52 } 53 if(m!=1) 54 printf("%d",m); 55 56 printf(" "); 57 } 58 int main() 59 { 60 int a,b,i; 61 scanf("%d%d",&a,&b); 62 63 64 for(i=a;i<=b;i++) 65 shuchu(i); 66 67 return 0; 68 }