IT Proに「腕試し」シリーズというのがありますが、あまりのレベルの低さに毎度毎度笑っていいものか悲しむべきか考えてしまいます。
回答者のことではありません。問題が無茶苦茶なのです。
直接ではありませんが、これも日本のIT技術者のレベルの低さを表しているようにも感じられて、……やっぱり悲しむべきことなのでしょうか。
public static void main(String[] args) {
long max =10000000;
int num = 91;
long t;
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc1(num);
}
System.out.println(System.currentTimeMillis()-t);
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc2(num);
}
System.out.println(System.currentTimeMillis()-t);
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc3(num);
}
System.out.println(System.currentTimeMillis()-t);
}
}
あまり数学知識のない普通の人が組むのがcalc1
これの方が(ループの)計算回数少ないでしょという人がcalc2
神?な人がcalc3
腕試し (スコア:2, 参考になる)
回答者のことではありません。問題が無茶苦茶なのです。
直接ではありませんが、これも日本のIT技術者のレベルの低さを表しているようにも感じられて、……やっぱり悲しむべきことなのでしょうか。
Re:腕試し (スコア:0)
疑問に思いました。
問い5の素数かどうか求める最も効率的なものという設問です
√91にもとめるのに必要な計算量って結構多きいのではと思い
Re:腕試し (スコア:1)
整数の問題の場合、半分の桁数の数よりちょっと多い数、としてかまいません。
今回だと、√91=10とすればいいので、
そんなに計算量はいりません。
さらに、
今回
Re:腕試し (スコア:0)
例えば√91を求めるのに1*1、2*2、3*3と増やしていって
91を超えるまで10*10にたどり着くのにかかる計算量が
大したことないって話ですよね?
掛け算は掛ける数の回数足し算をやっていると聞いたことがあります。
本当に、内部的なCPUレベルの処理時間、計算効率といった部分で
秀でているのか疑問に思ったのです。
でっちあげですが例えば
ベンチマークしたよん (スコア:0)
がどうとかでてくるので実際に使う一般的な高級言語(Java)でテスト
public class Test {
private static boolean calc1(int num ) {
int loop = num/2;
for( int i=2 ; i<loop ; i++ ) {
if( num%i==0 ) {
return false;
}
}
return true;
}
private static boolean calc2(int num ) {
int loop = (int)Math.sqrt(num);
for( int i=2 ; i<loop ; i++ ) {
if( num%i==0 ) {
return false;
}
}
return true;
}
private static boolean calc3(int num ) {
int loop=1;
while( loop<num ) {
loop=loop*2;
}
for( int i=2 ; i<loop ; i++ ) {
if( num%i==0 ) {
return false;
}
}
return true;
}
public static void main(String[] args) {
long max =10000000;
int num = 91;
long t;
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc1(num);
}
System.out.println(System.currentTimeMillis()-t);
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc2(num);
}
System.out.println(System.currentTimeMillis()-t);
t = System.currentTimeMillis();
for( int i=0 ; i<max ; i++ ) {
calc3(num);
}
System.out.println(System.currentTimeMillis()-t);
}
}
あまり数学知識のない普通の人が組むのがcalc1
これの方が(ループの)計算回数少ないでしょという人がcalc2
神?な人がcalc3
私のCPUとコンパイラでの結果では91という数値に限っては
calc2に比べcalc1の方が微妙に早い。
なんだ、俺理論正しいじゃん。
#コードがしょぼいというのはナシの方向で
Re:ベンチマークしたよん (スコア:1)
for(int i = 2; i * i < num; i++)
とか
int loop = 1;
while(loop * loop < num){ loop += 1; }
for(int i = 2; i < loop; i++)
の方が速いんじゃない?って話だったと思うんだけど。
Re:ベンチマークしたよん (スコア:0)
91を勝手に素数と思いこんでおりました。
素数で再度調査した結果calc2が早っすね。
なんだか残念。calc3は忘れて下さい・・・。
主題は一応sqrtとそのループ数の合計処理速度vs単純に/2とそのループ数の合計