C/C++ で大量 (最大 2^24) の大きな数値 (それぞれ最大 22 文字) を読み取る必要があります。そのような読み取りを実行する方法は?数字はスペースで区切られており、改行まですべて読む必要があります。getch() を使用して配列を埋めるか、よりスマートな解決策がありますか?
3 に答える
これらの「数字」は何ですか?それらが整数の場合、通常、C にはそのような大きな数に対する組み込みサポートはありません。「bignum」をサポートするためのライブラリが必要になります。それらが浮動小数点の場合は試すことができますdouble
が、精度はおそらく十分ではありません。
データについて詳しく知ることなく、より具体的にすることは困難です。質問にいくつかの数値を表示することを検討してください。そうしないと、非常に曖昧になります。
読み取りがシングルスレッドの場合はgetchar_unlocked()
、 を使用できます。これにより、操作ごとにストリームをロックするオーバーヘッドが回避されます。文字ごとに移動し、数を累積して、スペースを待ちます。スペースが表示されたら、数値を保存し、現在の値をゼロにします。
int *data = new int[MAX_LEN];
int *ptr = data;
int ch;
*ptr = 0;
while ((ch = getchar_unlocked()) != '\n') {
if (ch == ' ') {
ptr++;
*ptr = 0;
} else {
*ptr = (*ptr *10) + (ch -'0');
}
}
もちろん、このフラグメントはエラーチェックなどの「重要でない」ものを無視しますが、入力が「サニタイズ」されていれば問題ありません。たとえば、このようなものを使用して、ACM オンライン ジャッジで I/O コストを節約できます。
まず、整数を格納するための適切な型が必要です。これは 64 ビットの int よりも大きいため、おそらく構造化型が必要になるでしょう。独自に作成するか、次のようなライブラリを使用できます。
使用方法については、そのドキュメントをお読みください。
次に、その数値で何をしたいのかを明確にする必要があります: 合計、変換、検索、または転送? わかったら、整数に使用したデータ型を操作できます。