题目
输入一个正整数n(1≤n≤1e15),编程将其分解成若干个质因子(素数因子)积的形式。
输入格式:
任意给定一个正整数n(1≤n≤1e15)。
输出格式:
将输入的正整数分解成若干个质因子积的形式,质因子的出现顺序按从小到大排列。如:40=222*5;如果整数本身为质数或素数,直接输出,如:13=13。
输入样例:
在这里给出一组输入。例如:
40
输出样例:
在这里给出相应的输出。例如:
40=2*2*2*5
第一次写的代码
逻辑上没什么问题,但是复杂化了问题,没直接输出结果,而是用了两个数组做了两次筛选,最终运行超时,函数堆叠是因为在VS里初始化数组里给的数太大,这在PTA上没有影响
#include <stdio.h>
#include <math.h>
int prime(long int i)
{
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
long int n;
int a[1000] = { 0 };
int b[100] = { 0 };
int m = 0;
int k = 0;
long int i = 0;
scanf("%ld", &n);
if (prime(n))
{
printf("%ld=%ld", n, n);
}
else
{
for (i = 2; i < n; i++)
{
if (n % i == 0 && prime(i))
{
a[m++] = i;
}
}
long int t = n;
for (i = m - 1; i >= 0; i--)
{
while (t %a[i] == 0&&t!=0)
{
b[k++] = a[i];
t /= a[i];
}
if (t == 0)
{
break;
}
}
printf("%ld=", n);
for (i = k-1; i>=0; i--)
{
if (i != k-1)
{
printf("*");
}
printf("%d", b[i]);
}
}
return 0;
}
改进代码
#include <stdio.h>
#include <math.h>
int prime(long int i)
{
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
break;
}
}
if (j > sqrt(i))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
long int n;
int k = 0;
long int i = 0;
scanf("%ld", &n);
if (prime(n))
{
printf("%ld=%ld", n, n);
}
else
{
printf("%ld=", n);
long int m = n;
for (i = 2; i < n; i++)
{
while (m / i != 1&& m % i == 0)
{
if (prime(i))
{
printf("%ld*", i);
m /= i;
}
}
if (m / i == 1)
{
printf("%ld", m);
break;
}
}
}
return 0;
}