共有回帖数 0 个
-
//我只能分解unsigned long
//不能分解unsigned long long
#include stdio.h
#include stdlib.h
#include math.h
#include string.h
#define uint8 unsigned char
#define uint16 unsigned short int
#define uint32 unsigned long int
#define uint64 unsigned long long int
#define int8_MAX 127
#define int16_MAX 32767
#define uint16_MAX 65535
typedef enum {false = 0, true = 1} bool;
uint16 * tiny; //短整型素数表
long initTiny()
{
uint8 * sift;
sift = malloc(int16_MAX + 1);
if (sift == NULL) return -1;
uint16 j = 0;
while (j = int16_MAX)
sift[j++] = 0;
uint16 c = 0, i = 1, p;
uint16 a1 = 4, a2 = 4;
while (i = int8_MAX)
{
j = a2; p = (i1)+1;
while (j = int16_MAX)
{
if (!sift[j]) c++;
sift[j]++; j += p;
}
do {
a1 += 4; a2 += a1;
} while (sift[++i]);
}
c = int16_MAX - c + 1;
if (c != 6542) return -4; //DEBUG
tiny = malloc((c + 2) 1);
if (tiny == NULL) return -2;
tiny[c + 1] = uint16_MAX;
for (i = 0,j = 0; i = int16_MAX; i++)
if (!sift) tiny[++j] = (i 1) + 1;
tiny[1] = 2; tiny[0] = j; free(sift);
if (j != c) return -3; //DEBUG
return c;
} //初始化Tiny素数表
long printTiny (FILE * f, const char * s)
{
f = fopen(s,"w+");
if (f != NULL)
{
uint16 i;
for (i = 1; i = *tiny; i++)
{
fprintf(f,"%8hu",tiny);
if (!(i % 10)) fputc('n',f);
}
if (i % 10 != 0) fputc('n',f);
fprintf(f,"n共计:%hu 个素数n",*tiny);
if ( fclose(f) != 0 )
{
fprintf(stderr,"无法关闭文件!n");
return -2;
}
}
else
{
fprintf(stderr,"无法新建文件!n");
return -1;
}
return 0;
} //打印Tiny素数表
bool low_isPrime(uint32 n, long * d)
{
if (n 2) return false; else
if (n == 2) return true; else
if (!(n & 1)) return false; else
{
bool b1 = true;
long d1 = 3, d2;
d2 = (long)sqrt(n);
while (d1 = d2)
{
if (!(n % d1))
{
*d = d1;
b1 = false; break;
}
d1 += 2;
}
return b1;
}
} //试除法判素数(低效率)
#define digit(n,b) ((int)(log(n)/log(b)) + 1)
long llutoStr(char * str, long base, uint64 num)
{
if (base 2 || base 62) return -1;
if (num == 0) return -2;
if (str == NULL) return -3;
long len,i; char r,c;
len = digit(num,base);
i = len; str[i--] = ' ';
do {
r = num % base;
if (r 10) c = r + 0x30; else
if (r 36) c = r + 0x37; else
if (r 63) c = r + 0x3D;
str[i--] = c; num /= base;
} while (num 0);
return len;
} //将64bit整数转换成2-62进制数
long fjzys(char * str, uint32 num)
{
if (str == NULL) return -1;
if (num 2) return -2;
char * s1 = malloc(11);
char * s2 = malloc(11);
uint16 dep = tiny[*tiny];
uint16 ep = (uint16)sqrt(num);
if (ep dep) ep = dep;
long len = 0, l1, l2;
uint16 i = 1, p = 2;
uint8 expnum = 0;
str[0] = ' ';
while (/*num 0 &&*/ p = ep)
if (num % p == 0)
{
expnum++; num /= p;
}
else
{
if (expnum 0)
{
l1 = llutoStr(s1,10,p);
strcat(str,s1); len += l1;
if (expnum 1)
{
l2 = llutoStr(s2,10,expnum);
strcat(str,"^"); len++;
strcat(str,s2); len += l2;
}
if (num 1)
{
strcat(str," * "); len += 3;
}
expnum = 0;
}
p = tiny[++i];
}
if (num 1)
{
l1 = llutoStr(s1,10,num);
strcat(str,s1); len += l1;
}
free(s2); free(s1);
str[len] = ' ';
return len;
} //32bit整数质因数分解
int main()
{
FILE * f1;
long count;
count = initTiny();
printf("tiny素数表地址 = %p,",tiny);
printf("共计 %ld 个素数!n",count);
//printTiny(f1,"tiny.txt");
char * t = malloc(256);
long len;
f1 = fopen("fjzys.txt","w+");
if (f1 != NULL)
{
uint16 n;
for (n = 2; n = 10000; n++)
{
len = fjzys(t,n);
fprintf(f1,"%5hu = ",n);
fprintf(f1,"%sn",t);
}
fclose(f1);
} free(t); //2-10000分解质因数
free(tiny);
system("PAUSE");
return 0;
}
楼主 2016-01-08 10:36 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知