PAT_A1059

这是一道素数因子分解的问题:

1.先打印素数表出来,以便后期使用,素数表的大小就是10^5级别就可以,因为输入的数是long int(即就是int而已),大小最大21亿(10^10量级的),我们这里素数范围只需要sqrt(10^10)=10^5就行

(使用2-根号n依此取模的方式  或者  使用筛选法),我下面是使用筛选法直接打印素数表的

2.在sqrt_n范围的素数逐个进行一到多次取模运算判断是否是否为因子以及因子的阶数,并将结果存在struct factor的数组fac中

3.如若最后剩下的n不是1(因为n不断取模后,最后如果在sqrt_n范围内就能解决,n就会变为1,不需要再操作什么),即将n放入struct factor的数组fac中,阶数为1

4.最后就是按照格式要求打印就行,现在用着printf,scanf怎么感觉比以前cin,cout还要舒服,不知道是怎么回事哈哈

小坑:1.素数表是从2开始的,所以打印,判断素数什么的循环都要从i=2开始,不然会陷入死循环

   2.第三部判断n为1,不是n为0

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int isprime[100005];  //0是1不是 

void find_prime(int n){
    for(int i=2;i<=n;++i){  //从2开始 
        if(isprime[i]==0){
            for(int j=i+i;j<=n;j+=i){
                isprime[j]=1;
            }
        }
    }
}

struct factor{
    int f;
    int p;
}fac[20];

int main(){
    freopen("in.txt","r",stdin);
    
    int input; 
    scanf("%d",&input);
    if(input==1){ //特殊情况为1 
        printf("1=1");
        return 0;
    } 
    int n=input;
    
    int sqrt_n=sqrt(n);
    find_prime(sqrt_n);

    int posi=0;
    for(int i=2;i<=sqrt_n;++i){  //一定要从2开始 
        if(isprime[i]==0){
            int count=0;
            while(n!=0 && n%i==0){
                count++;
                n/=i;
            }
            if(count!=0){
                fac[posi].f=i;
                fac[posi].p=count;
                posi++;
            }
            if(n==0)
                break;
        }
    }
    if(n!=1){  //不等于1 
        fac[posi].f=n;
        fac[posi].p=1;
    }
    printf("%d=",input);
    for(int i=0;;++i){
        if(fac[i].p==0)
            break;
        if(i!=0)
            printf("*");
        printf("%d",fac[i].f);
        if(fac[i].p!=1)
            printf("^%d",fac[i].p);
    }
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/chuan-chuan/p/11490720.html