解题思路
首先把int范围内的素数计算出来存入数组中。然后从素数表中去除一个数与给定的n试除,如果能除尽说明是该数的因子,然后一直除并记录所除的次数,最后按照格式将素数因子与幂次一次打印出来,over!
空说无凭,show me the code!
版本1
#include<cstdio>
#include<cmath>
const int maxn=100005;
int prime[maxn],num=0;
bool p[maxn]={0};
void find_prime(){ //筛选素数
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[num++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
struct E{ //用来存素数因子和出现的次数
int x;
int cnt;
}buf[11];
int main(){
int n;
find_prime();
scanf("%d",&n);
int k=0;
if(n==1)
printf("1=1"); //特殊处理,注意,1不是素数,所以也不可能是因子
else{
printf("%d=",n);
int sqr=(int)sqrt(1.0*n);
for(int i=0;i<num&&i<=sqr;i++){
if(n%prime[i]==0){
buf[k].x=prime[i];
buf[k].cnt=0;
while(n%prime[i]==0){
buf[k].cnt++;
n=n/prime[i];
}
k++;
}
if(n==1) break;
}
if(n!=1) //如果存在一个大于sqrt(n)的因子,那一定是他本身,即这个数是个素数,唯一的因子就是自己
{
buf[k].x=n;
buf[k++].cnt=1;
}
for(int i=0;i<k;i++){
if(i>0)
printf("*");
printf("%d",buf[i].x);
if(buf[i].cnt>1)
printf("^%d",buf[i].cnt);
}
}
return 0;
}
版本2
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5; //这个范围内的素数
int p[maxn]={0};
int prime[maxn];
struct node{
int num,factor;
}E[10];
int k=0;
void findPrime(){
for(int i=2;i<maxn;i++){
if(p[i]==0){
prime[k++] = i;
for(int j=i+i;j<maxn;j+=i){
p[j]=1;
}
}
}
}
int main(){
int x;
scanf("%d",&x);
if(x==1){
printf("1=1");
return 0;
}
findPrime();
int n = x;
int j=0;
int sqr = sqrt(n);
for(int i=0;i<k && prime[i] <= sqr; i++){
if(n%prime[i]==0) j++;
while(n%prime[i]==0){
E[j].num = prime[i];
E[j].factor++;
n /= prime[i];
}
if(n==1) break;
}
if(n!=1){ //这个步骤很经典!!!
j++;
E[j].num = n;
E[j].factor=1;
}
printf("%d=",x);
for(int i=1;i<=j;i++){
if(i!=1) printf("*");
printf("%d",E[i].num);
if(E[i].factor != 1) printf("^%d",E[i].factor);
}
return 0;
}