【题目描述】
输入一个数,输出其素因子分解表达式。

【输入描述】
输入一个整数 n (2≤n<100)。

【输出描述】

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

【样例输入1】
60

【样例输出1】
2^2*3*5

【样例输入2】

1323

【样例输出2】

3^3*7^2


【分析】

(1)解题思想可以用递归,寻找子问题。也可以用暴力穷举思想
(3)所有的数字都是这个数的质因子的次方,这个题应该改成质因子分解。
(4)要求所有素因子从小到大排列
(5)如果一次性就除完,就没有中间的符号了(比如9),因此需要加个flag来判断是不是第一次

能被4整除的一定能被2整除,同理,6,8,10等一样

同理,能被6整除, 一定能被3整除。

可以想一下桶排的策略,用来计算次数

 while(x%y==0)
 {
        x/=y;
        a[y]++;
 }
//x是数值,y是第一个质数,从2开始枚举,这种方法是不会遇到4这种数字

【参考代码1】

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 10001
using namespace std;
int n;
int a[N],b[N];
void calculate(int x,int y)
{
	//x是数本身,y是质数 
    if(x==0||y>x)
        return;
    while(x%y==0)
    {
        x/=y;
        a[y]++;
    }
    calculate(x,y+1); //下一个数 
}
int main()
{
    bool flag=false; //用来判断是不是第一次输出 
 
    cin>>n;
    calculate(n,2); //n值和第一个质数 
 
    for(int i=2;i<=n;i++)
    {
        if(flag&&a[i])
            cout<<"*";
        if(a[i])
            flag=true;
        if(a[i]==1)
            cout<<i;
        else if(a[i]>1)
            cout<<i<<"^"<<a[i];
    }
    cout<<endl;
    return 0;
} 


返回目录:题解目录