neuq oj1625: 分解质因数

题目描述

问题描述   求出区间[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;
        }
}
%/
  1. 利用合数都是由若干个素数组成的,所以,我们可以将较小的素数找出来之后 
  2. 然后将这个区间里面由这个素数组成的合数都去掉,就这样一直循环,直到没有 
  3. 合数由最小的质数组成为止!

  1. void sushu()//素数为0,合数为1   
  2. {  
  3.     int i=2,j;  
  4.     for(j=i*i;j<=9989899;j+=i)  
  5.     {  
  6.             prim[j]=1;  
  7.     }  
  8.     for(i=3;i<=3161;i+=2)//因为除2之外的偶数都是合数,所以将2另外考虑   
  9.     {//然后直接在奇数里面找就行了   
  10.         if(prim[i]) continue;   
  11.         for(j=i*i;j<=9989899;j+=i)  //!!!i*i???!!!
  12.         {  
  13.             prim[j]=1;  
  14.         }  
  15.     }  
  16. }  
%/
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"); } } }

 

 
posted on 2017-08-25 13:42  bigganbing  阅读(265)  评论(0编辑  收藏  举报