【问题标题】:How To Append an Integer (with an Integer) in C++如何在 C++ 中附加一个整数(带整数)
【发布时间】:2012-08-27 16:03:04
【问题描述】:

我想知道是否有人可以告诉我如何在 C++ 中附加一个整数(与另一个整数)。基本上,如果我有一个值为 67 的 int,我将如何在它后面加上数字 4,所以整数现在是 674?提前致谢!

【问题讨论】:

    标签: c++ integer append


    【解决方案1】:

    将第一个乘以十的第二个数字的幂,然后将另一个相加。

    示例: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 寄存器中,那么两者都会竞争性能。因为当一个人忙于计算“power”函数时,另一个人忙于从 sse 中提取字符串并一个一个地放置必要的寄存器,并通过开始加法和乘法来构建另一个寄存器。 Power(10,x) 函数可以换成 10*10*10.... x 次,所以纯数学版本再次变得更快。

    如果您需要可读性,那么 eq- 的答案是 imo 最好的。

    【讨论】:

    • 可以通过ceil(log10(i1))获取位数
    • 注意log10(10)正好是1,所以结果可能不正确。也许ceil(log10(i1+.1))
    【解决方案2】:
    int appended = std::stoi(std::to_string(i1) + std::to_string(i2));
    // error checking left as an exercise
    

    【讨论】:

    • 用数字/变量替换什么?
    【解决方案3】:
    #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;
    }
    

    【讨论】:

      【解决方案4】:

      计算现有数字的位数,乘以它的十次方并与第二个数字相加。

      【讨论】:

        【解决方案5】:
        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;
        }
        

        减少代码重复的重构留给读者作为练习。

        【讨论】:

          【解决方案6】:

          这里有一个更严重的:

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

          这避免了浮点数学和字符串转换。

          【讨论】:

            猜你喜欢
            • 2018-05-28
            • 1970-01-01
            • 1970-01-01
            • 2010-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-26
            相关资源
            最近更新 更多