(MSX-BASIC) 100 DEFINT A-Z 110 FOR J=2 TO 1000 120 N=J: GOSUB 180: IF S<=J THEN 150 130 N=S: GOSUB 180: IF S<>J THEN 150 140 PRINT J;N 150 NEXT J 160 END 170 ' 180 S=0 190 FOR I=N/2 TO 1 STEP -1 200 IF (N MOD I)=0 THEN S=S+I 210 NEXT I 220 RETURN
3 : ナイコンさん[sage] : 2005/06/27(月) 12:39:46
(C言語) #include <stdio.h> main() { int j, s, sum(); for ( j = 2; j <= 10000; ++j ) { s = sum( j ); if ( s > j && sum( s ) == j ) printf( "%d %d\n", j, s ); } } sum( n ) int n; { int i, s; s = 0; for ( i = n/2; i >= 1; --i ) if ( (n % i) == 0 ) s += i; return s; }
そうだ、おれはチャリに乗ったことがあるんだ! (乗り回していたんだといいきれないむなしさ) 今回のはMOD判定がキモだろうから、とりあえずそこを考えてみた。 BASICでいうとこんな感じかなあ。 1100 *MOD REM IF (N MOD I)=0 THEN S=S+I 1110 M=N 1200 IF I AND 128 THEN 1280 1201 I=I+I:IF I AND 128 THEN 1270 1202 I=I+I:IF I AND 128 THEN 1260 1203 I=I+I:IF I AND 128 THEN 1250 1204 I=I+I:IF I AND 128 THEN 1240 1205 I=I+I:IF I AND 128 THEN 1230 1206 I=I+I:IF I AND 128 THEN 1220 1207 I=I+I 1210 IF M>=I THEN M=M-I 1215 I=I/2 1220 IF M>=I THEN M=M-I 1225 I=I/2 1230 IF M>=I THEN M=M-I 1235 I=I/2 1240 IF M>=I THEN M=M-I 1245 I=I/2 1250 IF M>=I THEN M=M-I 1255 I=I/2 1260 IF M>=I THEN M=M-I 1265 I=I/2 1270 IF M>=I THEN M=M-I 1275 I=I/2 1280 IF M>=I THEN M=M-I 1300 IF M=0 THEN S=S+I 1399 RETURN