3

C ++で整数(別の整数を含む)を追加する方法を誰かに教えてもらえないかと思っていました。基本的に、この値が67のintがある場合、整数が674になるように、数値4を追加するにはどうすればよいですか?前もって感謝します!

4

6 に答える 6

10

最初に10を掛けて、秒の桁数の累乗にし、もう一方を加算します。

例:63および5

63*10=630
630+5 =635

例:75および34

75*100=7500
7500+34=7534
int i1=75;
int i2=34;
int dn=ceil(log10(i2+0.001));     //0.001 is for exact 10, exact 100, ...
int i3=i1*ceil(pow(10,dn)); <---- because pow would give 99.999999(for some optimization modes)
i3+=i2;

編集:文字列バージョンには、2つのintからstrへの変換(低速)と1つの文字列連結(高速ではない)、および1つのstrからintへの変換(低速)が必要です。上位変換には、2つの加算、1つの対数、2つの上限、1つの累乗、1つの乗算が必要です。これらはすべて、文字列バージョンよりも確実にレイテンシが少ないサブステップのデータを取得/設定するためにメインメモリに触れることなくCPUで実行できます。コンパイラの設計により3〜4文字の文字列がsseレジスタに格納されている場合、両方がパフォーマンスを競います。1つは「べき」関数の計算で忙しい一方で、もう1つはsseから文字列を抽出し、必要なレジスタを1つずつ配置し、加算と乗算を開始して別のレジスタを構築するのに忙しいためです。Power(10、x)関数は10 * 10 * 10 .... x倍と交換できるため、純粋数学バージョンは再び高速になります。

必要な読みやすさであれば、eq-の答えは最高のimoです。

于 2012-09-02T19:24:27.463 に答える
9
int appended = std::stoi(std::to_string(i1) + std::to_string(i2));
// error checking left as an exercise
于 2012-09-02T19:23:52.457 に答える
2
#include <iostream>
#include <string>

int appendDigit(int base, int append) {
   std::string sBase = std::to_string(base);
   std::string sAppend = std::to_string(append);
   std::string result = sBase + sAppend;
   return std::stoi(result);

}

int main() {
   int a = 67;
   int b = 4;
   int c = appendDigit(a,b);
   std::cout << c;
}
于 2012-09-02T19:28:32.997 に答える
1

既存の数値の桁を数え、その10乗を掛けて、2番目の数値に加算します。

于 2012-09-02T19:24:59.887 に答える
0
int append_digits(int i1, int i2) {
    int result = 0;
    while (i1) {
        result *= 10;
        result += i1 % 10;
        i1 /= 10;
    }
    while (i2) {
        result *= 10;
        result += i2 % 10;
        i2 /= 10;
    }
    int final_result = 0;
    while (result) {
        final_result *= 10;
        final_result += result % 10;
        result /= 10;
    }
    return final_result;
}

コードの重複を減らすためのリファクタリングは、読者の課題として残されています。

于 2012-09-02T20:11:02.377 に答える
0

これがもっと深刻なものです:

int append_digits(int i1, int i2) {
    int i2_copy = i2;
    while (i2_copy) {
        i1 *= 10;
        i2_copy /= 10;
    }
    return i1 + i2;
}

これにより、浮動小数点演算と文字列変換が回避されます。

于 2012-09-02T20:13:43.687 に答える