競技プログラミングの問題を解いているときに約200までの素数の配列を作る必要があったのですが、配列の宣言場所を変えただけで不思議なバグが発生しました。
①まず、このようにすると素数だけprime配列の値が1になります。
(エラトステネスの篩を使った方が早いとかは分かってます。)
C++
1#include<bits/stdc++.h> 2using namespace std; 3void _main(); int main() { _main(); } 4 5int prime[210]; 6void _main() { 7for(int i=2;i<=210;i++){ 8 bool p=true; 9 for(int j=2;j<=sqrt(i);j++){ 10 if(i%j==0)p=false; 11 } 12 if(p)prime[i]=1; 13} 14for(int i=0;i<210;i++){if(prime[i]==1)cout<<i<<' ';} 15} 16 17出力 182 3 5 7 11 13 17 19 23 29 31 37 41 1943 47 53 59 61 67 71 73 79 83 89 97 20101 103 107 109 113 127 131 137 139 21149 151 157 163 167 173 179 181 22191 193 197 199
②しかし、int prime[210];の宣言を関数の内部に入れると
C++
1#include<bits/stdc++.h> 2using namespace std; 3void _main(); int main() { _main(); } 4 5void _main() { 6int prime[210]; 7for(int i=2;i<=210;i++){ 8 bool p=true; 9 for(int j=2;j<=sqrt(i);j++){ 10 if(i%j==0)p=false; 11 } 12 if(p)prime[i]=1; 13} 14for(int i=0;i<210;i++){if(prime[i]==1)cout<<i<<' ';} 15} 16 17出力 18 2 3 5 7 11 13 16 17 19 23 29 31 37 19 41 43 47 53 59 61 67 71 73 79 83 20 89 96 97 101 103 107 109 113 127 21 131 137 139 149 151 157 163 167 22 173 179 181 191 193 197 199 204 206
このように16とか96とか204とか206とか素数でない数字がなぜか入ってきます。
これらの数字はどういう理由で素数扱いされて入ってきたのでしょうか?
1時間くらいいろいろ調べて動かして考えたましたが、原因がさっぱり分からないので、理由や今後の類似事象の予防策など教えてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/20 04:27