#/*********************************************************** # isomer.rb -- 異性体の問題 #***********************************************************/ C = 17 # 炭素原子の数の上限 L = 2558 # 生成する基の個数の上限 size = []; length = []; count = [] (C+1).times { count.push(0) } n = size[0] = length[0] = 0 for i in 0...L print "#{i}\r" len = length[i] + 1; if (len > C / 2); break; end si = size[i] + 1; if (si + len > C); next; end for j in 0..i sj = si + size[j]; if (sj + len > C); next; end for k in 0..j sk = sj + size[k]; if (sk + len > C); next; end if ((n += 1) >= L); exit 1; end size[n] = sk; length[n] = len end end end print "\n" if (len <= C / 2); exit 1; end for i in 0..n print "#{i}\r" si = size[i] for j in 0..i if (length[i] != length[j]); next; end sj = si + size[j]; if (sj > C); next; end count[sj] += 1; # 偶数 for k in 0..j sk = sj + size[k] + 1; if (sk > C); next; end for h in 0..k sh = sk + size[h] if (sh <= C); count[sh] += 1; end # 奇数 end end end end print "\n" for i in 1..C printf("炭素原子が %2d 個のものは %5d 種類\n", i, count[i]) end exit 0