设x=p1^e1 +p2^e2…
求x的p1…pn和e1…en
#include<stdio.h>
int prime[10000];
bool mark[10001];
int size1;
void init()
{
for (int i = 0; i <= 10000; i++)
mark[i] = false;
size1 = 0;
for (int i = 2; i <= 10000; i++)
{
if (mark[i] == true)
continue;
prime[size1++] = i;
for (int j = i * i; j <= 10000; j += i)
mark[j] = true;
}
}
int main()
{
init();
int n;
while (scanf("%d", &n) != EOF)
{
int prime1[100];
int size2 = 0;
int mi[100];
for (int i = 0; i < size1; i++)
{
if (n%prime[i] == 0)
{
prime1[size2] = prime[i];
mi[size2] = 0;
while (n%prime[i] == 0)
{
mi[size2]++;
n = n / prime[i];
}
size2++;
if (n == 1)
break;
}
}
if (n != 1)
{
prime1[size2] = n;
mi[size2++] = 1;
}
int ans = 0;
for (int i = 0; i < size2; i++)
ans += mi[i];
printf("%d\n", ans);
for (int i = 0; i < size1; i++)
printf("%d\n", prime[i]);
}
return 0;
}
先求出sqrt(x)范围的所有素数。
依次测试得到的所有素数能否整除x,若能则表明改素数为它的一个素因数。
不断将x除以该素数,直到不能再被整除位置,同时统计其幂指数。
若在完成某个素数的幂指数统计后,x变为1,则表明所有素因数全部被分解出来,分解活动终止。
若遍历后x不等于1,则表示x存在一个大于该范围的寅子,且该因子必为其素因子,其幂指数必然为1。
但是,这其中可以更简洁。不需要求sqrt(x)范围的所有素数。
#include<stdio.h>
int main()
{
int m;
while (scanf("%d", &m) != EOF)
{
int prime[100];
int size = 0;
int mi[100];
for (int i = 2; i <= 10000; i++)
{
if (m%i == 0)
{
prime[size] = i;
mi[size] = 0;
while (m%i == 0)
{
mi[size]++;
m = m / i;
}
size++;
if (m == 1)
break;
}
}
if (m != 1)
{
prime[size] = m;
mi[size++] = 1;
}
for (int i = 0; i < size; i++)
{
printf("%d %d ", prime[i], mi[i]);
}
}
return 0;
}