2-07. 素因子分解(20)
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
给定某个正整数N,求其素因子分解结果,即给出其因式分解表达式 N = p1^k1 * p2^k2 *…*pm ^km。
输入格式说明:
输入long int范围内的正整数N。
输出格式说明:
按给定格式输出N的素因式分解表达式,即 N = p1^k1 * p2^k2 *…*pm ^km,其中pi为素因子并要求由小到大输出,指数ki为pi的个数;当ki==1即因子pi只有一个时不输出ki。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 1024 | 1024=2^10 |
2 | 1323 | 1323=3^3*7^2 |
3 | 97532468 | 97532468=2^2*11*17*101*1291 |
4 | 1 | 1=1 |
5 | 3 | 3=3 |
第一种方法超时
#include<stdio.h>
#include<math.h>
#define SIZE 100
int isPrime(long int n)
{
if(n==2)
return 1;
double sqrtN=sqrt(n*1.0);
int i;
for(i=2;i<=sqrtN;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
long int N,tempN;
long int a[SIZE], aExp[SIZE]={0},count=0; //因子,因子指数, 因子个数
scanf("%d",&N);
if(N==1)
{
printf("1=1\n");
return 0;
}
tempN=N;
int i=2;
for(;;i++)
{
if(N==1)
break;
if(!isPrime(i))//不是质数
continue;
int tempCount=0;
while(N%i==0)
{
N=N/i;
tempCount++;
}
//printf("%d\n",tempCount);
if(tempCount!=0)
{
a[count]=i;
aExp[count]=tempCount;
count++;
}
}
printf("%d=",tempN);
for(i=0;i<count;i++)
{
if(i==0)
{
if(aExp[i]==1)
printf("%d",a[i]);
else
printf("%d^%d",a[i],aExp[i]);
}
else
{
if(aExp[i]==1)
printf("*%d",a[i]);
else
printf("*%d^%d",a[i],aExp[i]);
}
}
printf("\n");
return 0;
}
#include<stdio.h>
#include<math.h>
#define SIZE 2000
int prime[SIZE];
int isPrime(long int n)
{
if(n==2)
return 1;
double sqrtN=sqrt(n*1.0);
int i;
for(i=2;i<=sqrtN;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
int i,j=0;
for(i=2;j<SIZE;i++) //前SIZE=2000个素数 //前2000个素数,先求出来,会大大提高效率
if(isPrime(i))
{
prime[j]=i;
j++;
}
int N,tempN;
int exp[SIZE]={0};
scanf("%d",&N);
tempN=N;
if(tempN==1)
{
printf("1=1\n");
return 0;
}
else
{
for(i=0;i<SIZE;i++)
{
int tempCount=0;
if(tempN==1)
break;
if(tempN%prime[i]==0)
{
while(tempN%prime[i]==0)
{
tempCount++;
tempN=tempN/prime[i];
}
}
exp[i]=tempCount;
//if(exp[i]!=0)
//printf("%d:%d\n",prime[i],exp[i]);
}
}
int first=1;
printf("%d=",N);
for(i=0;i<SIZE;i++)
{
if(exp[i]!=0 )
{
if(first)
{
if(exp[i]==1)
printf("%d",prime[i]);
else
printf("%d^%d",prime[i],exp[i]);
first=0;
}
else
{
if(exp[i]==1)
printf("*%d",prime[i]);
else
printf("*%d^%d",prime[i],exp[i]);
}
}
}
}