平成17年度秋季情報処理技術者試験まであと4日。
もう嫌だ……_| ̄|○
プログラム。
ちょっと専門的な話なので人によっては身内ネタ以上に意味が分からんかも(´д⊂
先生に聞いてみた。
プログラムとソースの仕様を説明。
int型だと動くのにlong long int型だと動かない、というわけの分からない現象に流石の先生も苦戦。
まず最初にソースコードを読みまくる。
どこかに変な記述があるか。
しかし、
じゃあlong long int型の仕様か?
そもそも0を表現できないってどういう仕様なのよ?('A`)
long long int型はint型を拡張して扱える数値を更に多くしたものなのだが……。
ヘルプを漁る。
こんなあんまり使わない型の説明は少なく、殆どが英語。
調べてみるがまともな記述は出てこない。
トレーサを使ってメモリを直接覗いてみる。
ってかこんな機能あるなんて知らなかったよ。
便利ですね( ´∀`)
変数に格納してる数値調べてみると、
f[1]に31〜とか何とか20桁くらいのわけの分からん数字が吐き出される。
(゚д゚)ハァ?
勿論printfだと入力した数値が出てきますよ。
意味不明。
scanfの後に、
a[1] = 0;
という記述を加えてみる。
→ちゃんと動いた
……?(´д`;)
どうやらscanfに問題があるらしい。
scanfのヘルプを読む。
すると、long long int型の入力は % + I64 + 型(要するにd) となっていた。
因みにlong int型だと % + l + 型 だった。
printfとかの場合だとlldで動かせる(はず)からここもこれでいけると思ってました。
先生の話によると、
__ が付く型はWindowsでは方言のようなものらしい。
今回の場合は__int64型ということになります。
あと、動かせることは動かせるけど不安定だとか何とか。
Windows側も確実に動かせる保証が無いからなるべく使わないようにしたいと。
だから__int64型とint型を使って計算する場合、
本来ならばint型はサイズの大きい__int64型に自動的にキャストされますが、
Windowsとしてはサポートしきれない__int64型にキャストして良いのかどうかに悩むとか。
よって安全性を考慮してint型のままの可能性もあるとも言ってました。
このことから、念の為に整数も64ビット整数に直しておいた方が良いとのこと。
修正版。
/*
組み立て除法で割り切れる値を探すプログラム