签到

06月21日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知