【问题标题】:How to replace all elements in vector by the sum of element digits?如何用元素位数之和替换向量中的所有元素?
【发布时间】:2017-11-16 16:22:30
【问题描述】:

我很难理解如何用元素数字的总和替换向量中的所有元素。例如,如果我有这样的数字序列9 22 54 981,我的输出必须是9 4 9 18。我知道如何计算总和。我有一个名为 file_numbers 的向量。但我被困在这一点上。感谢您的帮助。

   int SumOfDigits(int digit)
{

    int sum = 0;
    while (digit > 0)
    {
        sum += digit % 10;
        digit /= 10;
    }
    return sum;
}
void FourthTask(vector<int>& file_numbers)
{
    std::transform(file_numbers.begin(),
        file_numbers.end(),
        file_numbers.begin(),SumOfDigits);
}

【问题讨论】:

  • "如何用元素数字的总和替换向量中的所有元素" 提示:计算总和后,您不会进行任何替换(除了不重置sum 的值变为 0,然后再计算另一个数字的数字总和)。编辑:for (size_t i = 1;std::vector 的索引从 0 开始,所以你会错过第一个数字。
  • 将问题分为两部分:从数字 (54 -> 9) 计算总和,并转换向量的每个值。
  • 我只是创建一个新向量?
  • @Jarod42 这就是我试图完成这项任务的方式。我只是不明白如何转换这些值
  • 暂时忘掉向量吧。你真的应该写一个简单的函数,它接受一个 int 并返回数字的总和。一旦你有了它,然后只需在循环中使用向量的每个条目调用该函数。

标签: c++ vector


【解决方案1】:

您可能需要#include &lt;algorithm&gt;

int SumOfDigits(int digit)
{
    int sum = 0;
    while (digit > 0)
    {
        sum += digit % 10;
        digit /= 10;
    }
    return sum;
}

void FourthTask(vector<int>& file_numbers)
{
    std::transform(file_numbers.begin(), 
                   file_numbers.end(),
                   file_numbers.begin(),
                   SumOfDigits);
}

【讨论】:

  • 另外,SumOfDigits 应该被声明,因为它出现在 FourthTask 函数之后。
  • @PaulMcKenzie 是的。我移动了它:)
【解决方案2】:

先编码,后注释:

void SumTask(std::vector<int>& file_numbers){
    for (auto& i :  file_numbers){
        int sum = 0;
            while (i > 0){
                sum += i % 10;
                i /= 10;
            }
            i = sum;
    }
}

注意事项:

  • 求和 for 循环中,否则您还要对之前处理的所有数字求和
  • 使用范围循环,它们的优化非常好

【讨论】:

    【解决方案3】:

    将元素转换为字符串,然后对每个字符进行循环,将字符转换为 int 并将其与前一个字符的总和相加..

    【讨论】:

    • 为什么你需要将int 转换为string,如果你可以循环遍历它的数字(它的逻辑就在问题本身中)?这样的转换是没有意义的。
    • 将元素转换为字符串 -- 不。从int 中提取每个数字不需要将整数转换为字符串。
    • @MerakMarey -- 使用除法和模数。使用这些技术在纸上解决问题。
    • @MerakMarey -- 转换更便宜、更清晰 -- 如果您正在谈论转换为字符串,无论如何它都不是“更便宜”。字符串转换比简单地进行整数运算更昂贵。
    • 您没有考虑转换为字符串的内容。它不仅仅是一条或两条线的装配操作。相比之下,原生 int 上的整数数学运算更快,因为 需要一到两个汇编指令来执行的东西。底线——字符串的处理速度比int's 慢。只是一个警告——如果你去面试,你把“转换为字符串”作为这样做的一种方式,你会有麻烦的。
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2016-02-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2018-05-07
    • 2012-01-31
    相关资源
    最近更新 更多