/* 1〜1000までに存在する素数を1〜100、101〜200、・・・、 901〜1000のように100ずつ1カテゴリとして分類したとき、 各カテゴリ内に存在する素数が数が16個となるカテゴリは3つ存在する。 これらカテゴリに存在する素数すべてを用いて平均を求めなさい(小数点以下四捨五入)*/ #include int hurui(void); /* 数をふるいにかけて素数のみにする */ double calc(void); /* ふるいにかけられた数の中から素数の数が16個のカテゴリを計算し、それらの平均を求める */ int n[1005]; /* 数を格納する配列 */ int main(void){ int i; for(i=1;i<=1000;i++){ n[i]=i; } hurui(); /* 関数 hurui を実行 */ calc(); /* 関数 calc を実行 */ return 0; } int hurui(void){ int i,t,j; /* i,t,j = それぞれループ用 */ /* 1〜1000でループする */ /* i=1の時は1は素数ではないのでn[i]に0を代入する */ /* それ以降は、n[i]が0でないとき、n[i]を除くn[i]の倍数のときn[i]に0を代入する */ for(i=1;i<=1000;i++){ if(i==1){ n[i]=0; } if(n[i]!=0){ for(j=n[i]*2;j<=1000;j=j+n[i]){ n[j]=0; } } } return 0; } double calc(void){ int i,t; /* i,t = それぞれループ用 */ int count=0; /* 素数の数を数える */ int count2=0; /* もし count が16の時、最後に計算するときのために 素数の数をカウントしておく変数 */ int sum=0; /* 素数の合計を格納する */ double ans; /* 最終的な答えを格納する変数 */ /* 1から1000までループし、素数の数が16の時は sum に素数を足していき、 count2 に素数の数を格納していく */ for(i=1;i<=1000;i=i+100){ if(i==1){ for(t=1;t<=100;t++){ if(n[t]!=0){ count++; } } if(count==16){ for(t=1;t<=100;t++){ if(n[t]!=0){ count2++; sum+=n[t]; } } } count=0; } else if(i!=1){ for(t=i;t<=((i/100)+1)*100;t++){ if(n[t]!=0){ count++; } } if(count==16){ for(t=i;t<=((i/100)+1)*100;t++){ if(n[t]!=0){ count2++; sum+=n[t]; } } } count=0; } } ans=sum/count2; /* 素数の平均を求める */ printf("答えは %.1f です\n",ans); return ans; }