★初心者にVisual C++を教えるスレ★ Part38
■ このスレッドは過去ログ倉庫に格納されています
0205204
2012/02/26(日) 02:13:52.34失礼、見直したら宿題というわけではないのか
Visual C++でもない気がするけどどのスレなのか分からないから答えておくと
以下の2点だけでそれなりに改善できそうな気がする (>>204は考えてみたら面倒な割にコストが微妙そうだった)
1. 除算するとき、除数と商は対になるはずなので、計算は半分で良い
20の約数(1,2,4,5,10,20)なら
20/4が割り切れた時点で、4と5の両方が求められる
2. sqrt(sum)で除数と商が等しい状態になる、それ以上は計算しなくてよい
具体的には
sum2 = sum >> 1;
for(int idx = 3; idx < sum2; idx++){
を
int sum2 = int(sqrt((double)sum));
for(int idx = 3; idx < sum2; idx++){
として、
if (!(sum % idx)) {count++;}
を
if (!(sum % idx)) {
count++;
int div = sum / idx;
if (div != idx) {count++;} //除数と商が等しい場合を除き、対としてカウントする
}
とする
あと、数値が連続なら特定以上の約数を持つ最小の数値が2で割り切れるのは確実と思うけど、
対象が連続でないので、偶数であることは保証されないと考えるほうが安全と思う
■ このスレッドは過去ログ倉庫に格納されています