設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;
}