【问题标题】:How do I add numbers in a different order? [duplicate]如何以不同的顺序添加数字? [复制]
【发布时间】:2020-12-13 04:01:32
【问题描述】:

这是一个简单的问题,不要自找困难。

我有这样的循环

int arr[]{ 111, 222, 333 };
    
for (size_t i = 0; i < 3; i++) {
   test = 1000 * test + arr[i];    
}
std::cout << test;

它返回结果111222333

问题是如何让它输出结果333222111 简而言之,从另一边添加数字

您需要将此行更改为其他内容以以不同的方式添加值

test = 1000 * test + arr[i];    

我会稍微更新一下这个问题,那会很有趣,如果没有数组并且您以这种形式获取数据怎么办。

test = 1000 * test + X;

X 是一个未知数,而不是一个数组

【问题讨论】:

  • 不用说我喜欢副本上接受的答案;-)
  • 如果你对c++20感兴趣,可以使用std::ranges::views::reverse,如第二个欺骗目标中提到的那样。
  • 更新了问题)
  • 更新不应使答案无效。你应该问一个新问题。

标签: c++


【解决方案1】:

您可以使用反向迭代器从末尾开始循环:

#include <iostream>
#include <iterator>

int main() {
    int arr[]{ 111, 222, 333 };
    int test = 0;        
    for(auto it = std::rbegin(arr); it != std::rend(arr); ++it) {
        test = 1000 * test + *it;
    }
    std::cout << test;
}

这是使用 std::accumulate 和 lambda 的替代方法:

#include <iostream>
#include <iterator>
#include <numeric>

int main() {
    int arr[]{ 111, 222, 333 };
    int test = std::accumulate(std::rbegin(arr), std::rend(arr), 0,
        [](const auto a, const auto b){
            return 1000 * a + b;
        }
    );
    std::cout << test;
}

【讨论】:

  • 是的,明智的。如果您可以在另一个答案中使用 C++11 lamda,您将获得另一票?
  • @Bathsheba 你的意思是使用std::accumulatestd::for-each 或类似的东西?
  • 绝对,是的!
  • @Bathsheba 已添加 :)
【解决方案2】:

你可以使用

test = 1000 * test + arr[2 - i];

而不是行。

要处理数组以外的输入,您可以使用“delta”来跟踪插入新值的位置。

int delta = 1;
for (size_t i = 0; i < 3; i++) {
    test += delta * X;
    delta *= 1000;
}

【讨论】:

  • 您是第一个获得正确索引的人。哎呀。 +1。
  • @Bathsheba 其实我更喜欢arr[3 - 1 - i],因为我们可以使用相同的3,因此很容易将其替换为常数值。
  • @MikeCAT:我无法抗拒以我喜欢的方式--&gt;
  • 更新了问题,您的示例现在不起作用)
  • @buster 为新问题添加了答案。
【解决方案3】:

将循环从 i=2 迭代到 0,即 for(size_t i = 2; i >= 0; i --)

【讨论】:

  • 如果您使用 int,此方法有效,但不适用于 size_t 类型。
  • 更新了问题,您的示例现在不起作用)
【解决方案4】:

假设你不能反转arr中的元素,也许最简单的方法是写

test = 1000 * test + arr[2 - i];

也许不是对 2 进行硬编码。这比以另一种方式运行循环要简单得多:size_tunsigned,因此要使停止条件正确需要一些思考。我个人使用

for (size_t i = 3; i --> 0;) {

对于这种事情。请注意 幻灯片运算符 --&gt;。它根本不是一个真正的运算符,但它由后缀-- 和后面的比较组成。这不是每个人的口味,一些软件公司禁止使用它。

【讨论】:

  • 谢谢,但我认为不值得写这段代码--&gt; :)
  • @buster:你不喜欢for (size_t i = 3; i --&gt; 0;) {
  • 另一个变体是for (size_t i = 2; i &lt;= 2; --i) {,但我不喜欢重复。
  • @Bathsheba 虽然看起来很简单,但我看起来很困惑。
  • @buster:也许我做这件事已经太久了,但我觉得这很自然,而且不比函数指针声明差。
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多