0

次のコードは、int. を印刷するように変更するにはどうすればよいlong long intですか? 説明してください。

についてpcは、お読みくださいputchar_unlocked

inline void writeInt (int n)
{
    int N = n, rev, count = 0;
    rev = N;
    if (N == 0) { pc('0'); pc('\n'); return ;}
    while ((rev % 10) == 0) { count++; rev /= 10;}
    rev = 0;
    while (N != 0) { rev = (rev<<3) + (rev<<1) + N % 10; N /= 10;}
    while (rev != 0) { pc(rev % 10 + '0'); rev /= 10;}
    while (count--) pc('0');
    pc('\n');
    return ;
}
4

2 に答える 2

6

コード内の int については特に何もありません。両方の "int" を "long long int" に置き換えるだけで完了です。

(シフトによる*10の「最適化」を見つけて、残っているすべての分割を追加すると、まったくばかげています。まともなCコンパイラは、それを(さらに多くのことを)自動的に行います。そして、この「高速」バージョンをプロファイルすることを忘れないでくださいstdlib ルーチンを使用して、本当に努力する価値があることを確認してください)。

于 2013-01-06T23:49:48.153 に答える
5

このコードは、必要以上に複雑です。

inline void writeLongLong (long long n)
{
    char buffer[sizeof(n) * 8 * 3 / 10 + 3];  // 3 digits per 10 bits + two extra and space for terminating zero. 
    int index = sizeof(buffer)-1;
    int end = index;
    buffer[index--] = 0;
    do {
       buffer[index--] = (n % 10) + '0';
       n /= 10;
    } while(n);
    puts(&buffer[index+1]);
}

これは同じ仕事をし、約半分の除算/モジュロ演算であり、少なくとも私はそれをよりよく理解することができます. stdio/stdlib 関数はおそらくこれよりも優れていることに注意してください。この関数は負の数を処理しません (上記の関数も処理しません)。

于 2013-01-07T00:03:43.517 に答える