【问题标题】:How to generate number with 3 digit from list of number by c++?如何通过c ++从数字列表中生成3位数字?
【发布时间】:2019-05-23 07:43:08
【问题描述】:

我是一名新程序员,想从数字列表 (2,5,8) 中生成 3 位数字数组。我创建了一个代码,但输出不是我的预期结果。这是我的简单代码:

int main()
{
    int arr[3]={2,5,8};

    int d=3;
    int times=1;

    for (int a:arr){
        int sum = a;
        for (int i=1; i<d; i++){
            times *= 10;
            sum += a*times;
        }
        cout<<sum<<endl;
        sum=0;
    }

    return 0;
}

我预期的结果是 222,555 和 888,但实际输出是 222,55005 和 8800008。

【问题讨论】:

  • 你忘了重置times,把times = 1;放在你的外循环中。
  • 您不应该为数组中的每个数字重置times 变量吗?
  • @vahancho 是的,我不应该重置 times 变量。谢谢你提醒我。
  • @Blaze 你说得对,我忘记了。谢谢你提醒我。
  • @jowwyss79 没问题,很高兴它有帮助。 Raffallo 将其包装成一个答案,因此请确保对其进行投票并将其选为接受的答案。

标签: c++ arrays numbers generate


【解决方案1】:

这可能会有所帮助。你忘记重置times变量

int main()
{
    int arr[3]={2,5,8};

    int d=3;
    int times=1;

    for (int a:arr){
        int sum = a;
        for (int i=1; i<d; i++){
            times *= 10;
            sum += a*times;
        }
        cout<<sum<<endl;
        times = 1;   //<---added
        sum=0;
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    对于您当前生成 222、555、888 的代码,您忘记重新初始化 times

    您可能已经创建了一个子函数来进行说明:

    int mul_by_111(int n) // { return 111 * n; }
    {
        int sum = a;
        int times = 1;
        for (int i = 1; i < 3; ++i) {
            times *= 10;
            sum += a * times;
        }
        return sum;
    }
    
    int main()
    {
        int arr[] = {2, 5, 8};
        for (int a:arr){
            std::cout << mul_by_111(a) << std::endl;
        }
    }
    

    如果您希望笛卡尔积显示 222、225、228、522、..、888

    你可能(天真地)用 3 个循环来做:

    int main()
    {
        int arr[] = {2, 5, 8};
        for (int a:arr){
            for (int b:arr){
                for (int c:arr){
                    std::cout << a << b << c << std::endl;
                }
            }
        }
    }
    

    一些库如range-v3 提出cartesian_product 以允许更简单:

    for (auto t : ranges::view::cartesian_product(arr, arr, arr)) {
        std::cout << std::get<0>(t) << std::get<1>(t) << std::get<2>(t) << std::endl;
        // std::apply([](auto... args){ (std::cout << ... << args) << std::endl; }, t); // C++17
    }
    

    【讨论】:

    • 这对我很有帮助。谢谢。
    【解决方案3】:

    使用std::stringstream 变得微不足道:

    #include <sstream>
    #include <iostream>
    
    int main()
    {
      std::stringstream ss;
      ss << 2 << 5 << 8; 
      int result{};
      ss >> result;
      std::cout << result << std::endl;
    }
    

    更新:

    要使排列成为算法的一部分,您可以使用std::next_permutation

    std::string s("258");
    do {
        std::cout << s << '\n';
    } while(std::next_permutation(s.begin(), s.end()));
    

    【讨论】:

    • 首先我还考虑使用stringstream 来解决我的问题。但它是否可以从列表 (2,5,8) 中生成所有 3 位数的数字,如 285,288,282 等?
    • @jowwyss79 我根据您的要求更新了答案。有意义吗?
    • 是的,确实如此。感谢您的更新,它帮助了我。
    • 看来 op 想要笛卡尔积(OP 也想要 222),而 std::next_permutation 只提供排列,所以:258、285、528、582、825、852。
    【解决方案4】:

    问题在于变量的范围。只需将它们放在块中,一切都很好:

    int main()
    {
        int arr[3]={2,5,8};
    
        int d=3;
    
        for (int a:arr){
            int sum = a;
            int times=1;
            for (int i=1; i<d; i++){
                 times *= 10;
                 sum += a*times;
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    

    变量 sum 和 times 将在 blockentry 中初始化。无需重置它们。

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 2014-04-08
      • 2015-12-09
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2022-12-22
      • 2013-02-28
      • 1970-01-01
      相关资源
      最近更新 更多