【その他セット】> 総和の計算 (paizaランク C 相当) [難易度: 2095 ±22]
※リンク先へ移動するためには[paiza]へのログインが必要です。
2つの整数 A , B が与えられるので、 A, A + 1, .... B - 1, B の総和を求めてください。
入力値(例)
0 0
出力値(例)
0
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php list($a, $b) = explode(" ", trim(fgets(STDIN))); if (($a+$b) % 2 == 0) { (int) $p = ($a + $b) / 2; (int) $q = ($b - $a + 1); } else { (int) $p = ($a + $b); (int) $q = ($b - $a + 1) / 2; } if (is_int($p*$q)) { echo $p*$q; } else { (int) $pp = $p % 10**6; (int) $pc = ($p-$pp) / 10**6; (int) $qq = $q % 10**6; (int) $qc = ($q-$qq) / 10**6; (int) $a1 = $pp*$qc+$pc*$qq; (int) $a1x = $a1 % 10**6; (int) $a1c = ($a1-$a1x) / 10**6; (int) $a0 = $pp*$qq + $a1x*10**6; (int) $a0x = $a0 % 10**12; (int) $a0c = ($a0-$a0x) / 10**12; (int) $a2 = $pc*$qc + $a1c + $a0c; echo $a2,sprintf("%012d",$a0x); } ?> |
解説
問題文の入力例がよく分からなかったのですが、
入力例が「1 5」(1から5)の場合は、1+2+3+4+5=15となるようにする問題です。
ただ、桁数が大きくてPHPではオーバーフローを起こしてしまいました。
1 2 3 4 5 6 7 8 |
<?php //入力値 1 10000000000の場合 list($a, $b) = explode(" ", trim(fgets(STDIN))); $ans = (($a + $b) * ($b - $a + 1) / 2); echo $ans; //5.0000000005E+19 ?> |
PHP以外では↑のコードで通過するようです(各言語に直してください)。
解答例のコードは、どうしてもオーバーフローをなんとかする方法が見つからなくて、paizaの森で質問して教えてもらいました。(*'ω'*)