A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. //
  2. //  main.m
  3. //  寻找质数
  4. //
  5. //  输入一个整数,列出从2到这个数的所有质数
  6. //
  7. /**
  8. 思路:
  9. 1.     首先 可以知道前3个质数为2,3,5
  10. 2.     5以后的偶数肯定都不是质数 所以后面用之前求出来的质数+2 在算这个数是不是质数
  11. 3.     算是不是质数的时候没必要遍历1-这个数,每次都除一遍  只需 遍历之前求出的所有质数就可以了
  12. */
  13. #import <Foundation/Foundation.h>

  14. int main()
  15. {
  16.     long *p = NULL;  //指向质数存储区域的指针
  17.    
  18.     int total = 0;   //要寻找的质数个数
  19.     bool found = false; //是否找到质数
  20.        //提示用户输入一个整数
  21.     printf("你需要寻找多少个质数:(至少要4个)\n");
  22.     scanf("%d",&total);
  23.     //至少4个  如果小于4  就设置总数为4个
  24.     total = total < 4? 4: total;
  25.    
  26.    
  27.     //分配足够的内存 给质数区域
  28.     p = (long*)malloc(total*sizeof(long));
  29.     //没有分配内存 直接退出函数
  30.     if (p == NULL)
  31.     {
  32.         printf("连个内存都分配不出来,还做怎么啊!!!\n");
  33.         return 1;
  34.     }
  35.     //我们已经知道了前3个质数
  36.     *p = 2l;
  37.     *(p + 1) = 3l;
  38.     *(p + 2) = 5l;
  39.    
  40.     //寻找到的质数个数
  41.     int count = 3;
  42.     //测试的整数
  43.     long trial = 5l;
  44.     //开始寻找质数
  45.     while (count < total)
  46.     {
  47.         trial += 2l;
  48.         for (int i = 0;i < count ; i++)
  49.         {
  50.             
  51.             if (!(found = trial % *(p+i)))
  52.             {//遍历过程中有一次能被整除 就退出循环
  53.                 break;
  54.             }
  55.         }
  56.         
  57.         if (found)//遍历完毕后  trial 不能被它之前的质数整除
  58.         {
  59.             *(p + count++) = trial;//将找到的trail加入我们的质数库  质数数量+1
  60.         }
  61.     }
  62.     //打印质数
  63.    
  64.     printf("以下为我们找到的%d个质数:\n",total);
  65.     for (int i = 0 ; i<total; i++)
  66.     {//输出找到的质数 左对齐 占12个字符
  67.         printf("%-12ld",*(p+i));
  68.         
  69.         if ((i+1)%6==0)
  70.         {
  71.             //每6个换一次行
  72.             printf("\n");
  73.         }
  74.     }
  75.     return 0;
  76. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马