因子分解
【题目描述】
输入一个数,输出其素因子分解表达式。
【输入描述】
输入一个整数 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;
}
(adsbygoogle = window.adsbygoogle || []).push({});