/*
prime2.c ふるい法により、素数を求める 動的記憶領域
n以下の素数を全部調べたいと思ったとき、2〜nの各数
が素数か否かを記憶しておくための配列を用意する。
最初はすべての数が素数の候補だから、全部に旗を
立てる。実際には1を入れる。次に、倍数になっている
数の旗を降ろす。実際には0を入れる。そして、最後
まで旗が立ったままの数が素数なのでそれをプリント
する。

上限値:1000
     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   103   107   109   113
   127   131   137   139   149   151   157   163   167   173
   179   181   191   193   197   199   211   223   227   229
   233   239   241   251   257   263   269   271   277   281
   283   293   307   311   313   317   331   337   347   349
   353   359   367   373   379   383   389   397   401   409
   419   421   431   433   439   443   449   457   461   463
   467   479   487   491   499   503   509   521   523   541
   547   557   563   569   571   577   587   593   599   601
   607   613   617   619   631   641   643   647   653   659
   661   673   677   683   691   701   709   719   727   733
   739   743   751   757   761   769   773   787   797   809
   811   821   823   827   829   839   853   857   859   863
   877   881   883   887   907   911   919   929   937   941
   947   953   967   971   977   983   991   997
素数の数 168 個

*/

#include 
#include 

void print_primes(int n)
{
  char *table;
  int i,j,count;
  

  table = malloc(n+1);
  if( table == NULL){
    fprintf(stderr, "ふるいが確保できません\n");
    return;
  }

  for(i=2; i<=n; i++)
    table[i] = 1;

  for(i=2; i<=n; i++){
    if(table[i] == 0)  /*素数でない*/
      continue;      /*からパス*/

    for(j=i*2; j<=n ; j+=i)      /*倍数を除去*/
      table[j]=0;
  }

  for(count = 0, i=2; i<=n; i++){
    if(table[i]==0)        /*素数でない*/
      continue;              /*からパス*/  

    if( (count > 0) && (count %10 == 0) )
      printf("\n");

    printf("%6d",i);
    count++;
  }

  printf("\n素数の数 %d 個\n",count);

  free(table);

}

int main()
{
  int n;

  printf("上限値:");
  scanf("%d", &n);

  print_primes(n);
}


/*
prime1.c ふるい法により、素数を求める 配列
n以下の素数を全部調べたいと思ったとき、2〜nの各数
が素数か否かを記憶しておくための配列を用意する。
最初はすべての数が素数の候補だから、全部に旗を
立てる。実際には1を入れる。次に、倍数になっている
数の旗を降ろす。実際には0を入れる。そして、最後
まで旗が立ったままの数が素数なのでそれをプリント
する。
*/

#include 

void print_primes(int n)
{
  char table[n+1];
  int i,j,count;
  
  for(i=2; i<=n; i++)
    table[i] = 1;

  for(i=2; i<=n; i++){
    if(table[i] == 0)  /*素数でない*/
      continue;      /*からパス*/

    for(j=i*2; j<=n ; j+=i)      /*倍数を除去*/
      table[j]=0;
  }

  for(count = 0, i=2; i<=n; i++){
    if(table[i]==0)        /*素数でない*/
      continue;              /*からパス*/  

    if( (count > 0) && (count %10 == 0) )
      printf("\n");

    printf("%6d",i);
    count++;
  }

  printf("\n素数の数 %d 個\n",count);
}

int main()
{
  int n;

  printf("上限値:");
  scanf("%d", &n);

  print_primes(n);
}


/*
1000以下の素数を列挙(第1版)
*/

#include 

int main(void)
{
  int i,n;
  unsigned long counter = 0;
  
  for (n=2; n<=1000; n++){
    for (i=2; i < n; i++){
      counter ++;
      if (n % i == 0)
	break;
    }
    if (n==i)
      printf("%d\n",n);
  }
  
  printf("除算を行った回数: %lu\n", counter);

  return(0);
}


/*
1000以下の素数を列挙(第2版)
*/

#include 

int main(void)
{
  int i,n;
  int prime[500];
  int ptr=0;
  unsigned long counter = 0;
  
  prime[ptr++] = 2;
  prime[ptr++] = 3;

  for (n=5; n<=1000; n += 2){
    for (i=1; i<ptr; i++){
      counter++;
      if (n % prime[i] ==0)
	break;
    }
    if (ptr ==i)
      prime[ptr++] =n;
  }
  for (i=0; i < ptr;i++)
    printf("%d\n",prime[i]);

  printf("除数を行った回数:%lu\n",counter);
  
  return(0);

}


/*
1000以下の素数を列挙(第3版)
*/

#include 

int main(void)
{
  int i,n;
  int prime[500];
  int ptr =0;
  unsigned long counter =0;

  prime[ptr++] = 2;
  prime[ptr++] = 3;

  for (n = 5; n<=1000; n += 2) {
    int flag = 0;
    for (i = 1; counter++,prime[i] * prime[i] <=n; i++) {
      counter++;
	if (n%prime[i] ==0) {
	  flag = 1;
	  break;
	}
    }
    if (!flag)
      prime[ptr++]  = n;
  }

  for (i=0 ; i < ptr; i++)
    printf("%d\n", prime[i]);

  printf("乗除を行った回数: %lu\n",counter);

  return(0);
}



Back to C Language

Google




BLOG
PICASAWEB
Panoramio


REF:



素数大百科


C言語によるはじめてのアルゴリズム入門