描述
输入一个数,输出其素因子分解表达式。
输入输入一个整数 n (2 <= n < 100)。输出输出该整数的因子分解表达式。
表达式中各个素数从小到大排列。
如果该整数可以分解出因子a的b次方,当b大于1时,写做 a^b ;当b等于1时,则直接写成a。
样例输入
60
样例输出
2^2*3*5
自己写的程序很复杂,调试也一直通不过,附上辣鸡的WA代码与别人写的简练的AC代码,过几天就要参加北大信科夏令营了,临时抱佛脚感觉要GG了
WA代码
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int k;
int same=0;
int pre=-1;
int cnt=0;
int flag=0;
int first=1;
int num[100];
int main()
{
num[cnt++]=2;
num[cnt++]=3;
for(int i=4;i<100;i++)
{
flag=0;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
if(flag==0)
{
num[cnt++]=i;
}
}
scanf("%d",&k);
for(int i=0; i<cnt; i++)
{
if(k==1)
{
break;
}
if(k%num[i]==0)
{
k=k/num[i];
if(k==1&&pre==-1)
{
printf("%d",num[i]);
break;
}
if(num[i]==pre||pre==-1)
{
pre=num[i];
same++;
i--;
continue;
}
if((num[i]!=pre&&same!=1)||(k==1&&num[i]==pre))
{
if(first==1)
{
printf("%d^%d",pre,same);
first=0;
}
else
printf("*%d^%d",pre,same);
pre=num[i];
same=1;
continue;
}
if((num[i]!=pre&&same==1)||(k==1&&same==1))
{
if(first==1)
{
printf("%d",pre);
first=0;
}
else
printf("*%d",pre);
if(k==1)
{
printf("*%d",num[i]);
}
pre=num[i];
same=1;
continue;
}
}
}
return 0;
}
AC代码(来源:https://blog.csdn.net/da_kao_la/article/details/79598603)
#include<stdio.h>
#include<map>
#include<string>
using namespace std;
static int zhiShu[29] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,77,79,83,89,97};
int main()
{
int n = 0;
scanf("%d", &n);
map<int,int> fenJie; // 不像java,C++实例化map的时候不要new
map<int,int>::iterator it;
int oldValue = 1;
int i=0;
for (i=0; i<29; i++)
{
while(n%zhiShu[i]==0)
{
n /= zhiShu[i];
fenJie[zhiShu[i]]++; // 不管键值zhiShu[i]在不在map中,都只要这样写就行了,非常方便
}
if(n == 1)
{
break;
}
}
for (it = fenJie.begin(); it!= fenJie.end(); it++)
{
if(it != fenJie.begin())
{
printf("*");
}
printf("%d", it->first);
if(it->second != 1)
{
printf("^%d", it->second);
}
}
return 0;
}