NOI-OJ 1.13 ID:22 因子分解

NOI-OJ 1.13 ID:22 因子分解

总时间限制: 1000ms 内存限制: 65536kB
描述
输入一个数,输出其素因子分解表达式。

输入
输入一个整数 n (2 <= n < 100)。
输出
输出该整数的因子分解表达式。
表达式中各个素数从小到大排列。
如果该整数可以分解出因子a的b次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a。
样例输入

60

样例输出

2^2*3*5

关键点

  1. 找到素数(使用素数筛)
    这道题的数据很小(2~100),其实直接先算出来,存到数组即可。
  2. 因子求解
    从小到大查看素数是否可以被整除,这边我的算法可以优化(也是必须要会):比如计算2,一直等到 x % 2 ! = 0 x\%2!=0 x%2!=0为止。把2的次数给求出来了,也直接能输出。

算法评价

  1. 代码太复杂,1)可以一次性把次方都计算出来。2)在计算出次方之后,可以直接输出。
  2. 可以不使用prime数组。

代码

const int maxn = 1001;

int prime[maxn] = {0}; // 素数数组
int p[maxn] ={0}; // 0表示素数

int FindPrime(int M){
    int cot = 0;
    p[0] = p[1] = 1;
    for(int i=2;i<=M+1;i++){
        if(p[i]==false){
            prime[cot++]=i;
            for(int j=2*i;j<=M+1;j+=i){
                p[j]=1;
            }
        }
    }
    return cot;
}

int main(){

    int a = 0;
    // input
    cin >> a;
    // find the number of prime
    int cot = FindPrime(a);
    int num = a;
    int num1[cot] ={0}; // save times
    int note = 0; // 
    while(num!=1){
        int index=0;
        while(prime[index]!=0){ // 可以一次把prime全部整除掉。
            if(num%prime[index]==0){
                if(prime[index]>prime[note]){ //记录最大的因子,知道哪一个素数是最后一个素数,用于输出。
                    note=index;
                }
                num1[index]++;
                num = num / prime[index];
                break;
            }
            index++;
        }
    }
    // output
    for(int i=0;i<cot;i++){
        if(num1[i]==1)
            cout << prime[i];
        else if(num1[i]>1)
            cout << prime[i] << "^" << num1[i];
        else{
            continue;
        }
        if(i!=note){
            cout << "*";
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值