您的位置:首页 > 其它

100以内的质因数分解并计算完全平方数

2010-02-27 07:40 495 查看
代码价值:用时3天

//求100以内的质因数分解,同时计算x!,是否是一个完全平方数
//tips:质因数每项都为偶数个,则x就是一个完全平方数
//运行后观察并结论:任何 x! 都不是完全平方数(除了0,和1以外)

#include <math.h>	//ceil
#include <stdio.h>	//printf
#include <stdlib.h>	//malloc
#include <string.h>	//memset
#include <stdbool.h>	//true
#include <iso646.h>	//and

const int primes26[] =
{ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101 };

//#define MAX_PRIME_DIVISOR_COUNT_UNDER_1024 10 //2^10 = 1024
#define MAX_PRIME_DIVISOR_COUNT_UNDER_128 7	//2^7 = 128
#define PRIME_COUNT_UNDER_101 26	//2^7 = 128
//data structure divisor_array = {int d_count, [d1, d1_count, d2, d2_count, d3, ...]}
//data structure divisor_array max len 100

//param n,      a nature number
//param primes, a int[] prime array
//param out,    return int[] divisors array as: {d_count, [d1, d1_count, d2, d2_count, d3, ...]}
//              which d_count is count of divisors at first
void PrimeDivisors(int n, const int *const primes, int *const out)
{
int d_count = 0;
switch (n)
{
case 0:
;
case 1:
*out = d_count;
return;
}

int factorCount = 0;
while (((n & 1) == 0)and(n > 1))	//test factor of 2
{
factorCount++;
n >>= 1;
}

int *pout = out + 1;	//write power of 2
int denom = 2;	//cache =*pprimes=2
int *pprimes = (int *)primes;	//pointer to prime array
do
{
if (factorCount > 0)
{
*pout++ = denom;
*pout++ = factorCount;
d_count++;
}
if (n > 1)
{
pprimes++;
denom = *pprimes;
int SqrtN;
SqrtN = ceil(sqrt(n));
if (denom >= SqrtN)
{
*pout++ = n;	//n is a prime now
*pout++ = 1;
d_count++;
break;
}
}
else	//n==1 all end
{
break;
}

factorCount = 0;	//reset
div_t ttt;
goto loptest1;
do
{
factorCount++;
n = ttt.quot;
loptest1:
ttt = div(n, denom);
} while (0 == ttt.rem);
} while (1);

*out = d_count;
return;
}

//param in a {array_len, int[]},
//return true if all element are even in array
bool IsAbsoluteSquareNumber(int *in)
{
int d_count = *in;
if (d_count == 0)
return false;
int *p = in + 1;
for (int i = 0; i < d_count; i++)
{
if ((p[i] & 1) == 0)
{
continue;
}
else
{
return false;
}
}
return true;
}

//out is holds int[] = {count of divisor 2, ... of divisor 3, ... of 5, ...7, ...}
//out = in + out
void addto(const int *const primes, int *in, int *out)
{
int d_count_in = in[0];
if (d_count_in == 0)
return;
int *p_in = in + 1;
for (int i = 0; i < d_count_in; i++)
{
int divisor = *p_in;
//search divisor in prime array return its index
int iD;
for (iD = 0; divisor > primes[iD]; iD++)
{
}
if (divisor < primes[iD])	//bad divisor or bad prime
{
//exception
}
p_in++;
out[iD] += *p_in;
p_in++;
}
return;
}

// function search_factorial_is_absolutesquarenumber_under_101
// param range, calc range from 1 to 100
// param primes, a array of prime
// param out, a {arraylen, int[]}, element_count, and n1,n2,n3,,,,
void search_f_asn101(const int *const primes, int * const out)
{
int positiveNum_count = 0;
int *pout = out + 1;
void *const memblock = malloc(sizeof(int)*(1 + PRIME_COUNT_UNDER_101 + 1 + MAX_PRIME_DIVISOR_COUNT_UNDER_128));
int *const pbSum = (int *)memblock;	//pointer to a mem block, holds sums of divisors which is divisors of x!
int *const pbTempDivisorArray = (int *)(pbSum + 1 + PRIME_COUNT_UNDER_101);	//pointer to a block of int

//quick init
*pbSum = 26;
*(pbSum + 1) = 1;
memset(pbSum + 2, 0, PRIME_COUNT_UNDER_101 - 1);

for (int i = 3; i <= 100; i++)
{
PrimeDivisors(i, primes, pbTempDivisorArray);
addto(primes, pbTempDivisorArray, pbSum+1); //x! = (x-1)! * x
if (IsAbsoluteSquareNumber(pbSum))
{
positiveNum_count++;
*pout++ = i;
}

printf("%d/n", i);
for (int i = 1; i < (1 + PRIME_COUNT_UNDER_101); i++)
{
printf("%d,", pbSum[i]);
}
printf("/n");
}
free(memblock);

*out = positiveNum_count;
return;
}

int main(void)
{
int *result = (int *)malloc(100 * sizeof(int));
search_f_asn101(primes26, result);
int count = *result;
if (count > 0)
{
int *p = result + 1;
for (int i = 0; i < count; i++)
{
printf("%d/t", p[i]);
}
}
free(result);
exit(EXIT_SUCCESS);
}
=============== output ===============
3
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4
3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5
3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6
4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
7
4,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8
7,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9
7,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
10
8,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11
8,2,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12
10,3,2,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
13
10,3,2,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14
11,3,2,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
15
11,4,3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16
15,4,3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
17
15,4,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
18
16,4,3,2,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
19
16,4,3,2,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
20
18,4,4,2,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
21
18,5,4,3,3,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
22
19,5,4,3,4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
23
19,5,4,3,4,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
24
22,6,4,3,4,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25
22,6,4,3,4,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
26
23,6,4,3,4,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
27
23,9,4,3,4,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
28
25,9,4,4,4,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
29
25,9,4,4,4,2,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
30
26,10,5,4,4,2,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
31
26,10,5,4,4,2,1,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
32
31,10,5,4,4,2,1,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
33
31,11,5,4,5,2,1,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
34
32,11,5,4,5,2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
35
32,11,6,5,5,2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36
34,11,6,5,6,2,2,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
37
34,11,6,5,6,2,2,1,1,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
38
35,11,6,5,6,2,2,2,1,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
39
35,12,6,5,6,3,2,2,1,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
40
38,12,7,5,6,3,2,2,1,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
41
38,12,7,5,6,3,2,2,1,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
42
39,13,7,6,6,3,2,2,1,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
43
39,13,7,6,6,3,2,2,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
44
41,13,7,6,7,3,2,2,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
45
41,15,8,6,7,3,2,2,1,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
46
42,15,8,6,7,3,2,2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
47
42,15,8,6,7,3,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
48
46,16,8,6,7,3,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
49
46,16,8,6,7,3,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
50
47,16,8,6,7,3,2,2,2,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
51
47,17,8,6,7,3,3,2,2,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
52
49,17,8,6,7,4,3,2,2,3,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
53
49,17,8,6,7,4,3,2,2,3,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
54
50,20,8,6,7,4,3,2,2,3,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
55
50,20,9,6,8,4,3,2,2,3,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
56
53,20,9,7,8,4,3,2,2,3,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
57
53,21,9,7,8,4,3,3,2,3,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
58
54,21,9,7,8,4,3,3,2,4,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,
59
54,21,9,7,8,4,3,3,2,4,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0,0,
60
56,22,10,7,8,4,3,3,2,4,1,1,1,1,1,2,1,0,0,0,0,0,0,0,0,0,
61
56,22,10,7,8,4,3,3,2,4,1,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
62
57,22,10,7,8,4,3,3,2,4,2,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
63
57,24,10,8,8,4,3,3,2,4,2,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
64
63,24,10,8,8,4,3,3,2,4,2,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
65
63,24,11,8,8,5,3,3,2,4,2,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
66
64,25,11,8,9,5,3,3,2,4,2,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,
67
64,25,11,8,9,5,3,3,2,4,2,1,1,1,1,2,1,1,1,0,0,0,0,0,0,0,
68
66,25,11,8,9,5,4,3,2,4,2,1,1,1,1,2,1,1,1,0,0,0,0,0,0,0,
69
66,26,11,8,9,5,4,3,3,4,2,1,1,1,1,2,1,1,1,0,0,0,0,0,0,0,
70
67,26,12,9,9,5,4,3,3,4,2,1,1,1,1,2,1,1,1,0,0,0,0,0,0,0,
71
67,26,12,9,9,5,4,3,3,4,2,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,
72
70,26,12,9,10,5,4,3,3,4,2,1,1,1,1,2,1,1,1,1,0,0,0,0,0,0,
73
70,26,12,9,10,5,4,3,3,4,2,1,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
74
71,26,12,9,10,5,4,3,3,4,2,2,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
75
71,27,12,9,10,5,4,3,3,5,2,2,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
76
73,27,12,9,10,5,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
77
73,27,12,10,11,5,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
78
74,28,12,10,11,6,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,0,0,0,0,0,
79
74,28,12,10,11,6,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,1,0,0,0,0,
80
78,28,13,10,11,6,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,1,0,0,0,0,
81
78,32,13,10,11,6,4,4,3,5,2,2,1,1,1,2,1,1,1,1,1,1,0,0,0,0,
82
79,32,13,10,11,6,4,4,3,5,2,2,2,1,1,2,1,1,1,1,1,1,0,0,0,0,
83
79,32,13,10,11,6,4,4,3,5,2,2,2,1,1,2,1,1,1,1,1,1,1,0,0,0,
84
81,33,13,11,11,6,4,4,3,5,2,2,2,1,1,2,1,1,1,1,1,1,1,0,0,0,
85
81,33,14,11,11,6,5,4,3,5,2,2,2,1,1,2,1,1,1,1,1,1,1,0,0,0,
86
82,33,14,11,11,6,5,4,3,5,2,2,2,2,1,2,1,1,1,1,1,1,1,0,0,0,
87
82,34,14,11,11,6,5,4,3,6,2,2,2,2,1,2,1,1,1,1,1,1,1,0,0,0,
88
85,34,14,11,12,6,5,4,3,6,2,2,2,2,1,2,1,1,1,1,1,1,1,0,0,0,
89
85,34,14,11,12,6,5,4,3,6,2,2,2,2,1,2,1,1,1,1,1,1,1,1,0,0,
90
86,36,15,11,12,6,5,4,3,6,2,2,2,2,1,2,1,1,1,1,1,1,1,1,0,0,
91
86,36,15,12,12,7,5,4,3,6,2,2,2,2,1,2,1,1,1,1,1,1,1,1,0,0,
92
88,36,15,12,12,7,5,4,4,6,2,2,2,2,1,2,1,1,1,1,1,1,1,1,0,0,
93
88,37,15,12,12,7,5,4,4,6,3,2,2,2,1,2,1,1,1,1,1,1,1,1,0,0,
94
89,37,15,12,12,7,5,4,4,6,3,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,
95
89,37,16,12,12,7,5,5,4,6,3,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,
96
94,38,16,12,12,7,5,5,4,6,3,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,
97
94,38,16,12,12,7,5,5,4,6,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,
98
95,38,16,12,12,7,5,5,4,6,3,2,2,2,2,3,1,1,1,1,1,1,1,1,1,0,
99
95,40,16,12,13,7,5,5,4,6,3,2,2,2,2,3,1,1,1,1,1,1,1,1,1,0,
100
97,40,16,12,13,7,5,5,4,7,3,2,2,2,2,3,1,1,1,1,1,1,1,1,1,0,
Press any key to continue...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: