【问题标题】:Minimize Number [closed]最小化数量[关闭]
【发布时间】:2021-12-31 09:21:25
【问题描述】:
#include<iostream>
using namespace std;
int main ()
{
    int counter=0;
    int num;
    cin>>num;
    int *arr=new int [num];
    for(int x=0;x<num;x++)
    {
        cin>>arr[x];
    }//[12,12]
        for(int x=0;x<num;x++)
        {
            /*
            first
            ****************************
            12/2=6
            12/2=6
            counter=1
            counter=2
            last value
            counter=2/2=1
            x=0
            second
            ****************************
            6/2=3
            6/2=3
            counter=1+1+1(last value from first operation)3
            ****************************
            another test with input [200,200]
            first case
            200/2=100
            200/2=100
            check=2
            2==2
            then
            startover x=0
            counter=counter/2
            then counter = 1
            -----------
            100/2==50
            100/2=50
            check=2
            2==2
            then startover
            
            */
            if(arr[x]%2==0)
            {
                arr[x]=arr[x]/2;
                ++counter;
            }
                if(counter==num)//true 2==2
                {
                x=0;
                counter=counter/num;//2/2
                }
            if(arr[x]%2!=0)
            break;
        }
        cout<<counter<<endl;
    return 0;
}

给定一个数字 N 和一个包含 N 个正数的数组 A。打印可以执行的最大可能操作。

操作如下:如果所有数字都是偶数,则将每个数除以2,否则不能再进行任何操作。

输入 第一行包含 N (1 ≤ N ≤ 200) 个元素。

第二行包含 N 个数字(1  ≤  Ai  ≤  109)。

输出 打印可以执行的最大可能操作数。

示例 输入 3 8 12 40 输出 2 输入 4 5 6 8 10 输出 0 这是一个叫做最小化数字的问题我写这个代码但是在某些测试用例中我得到错误例如当输入 200 200 我得到输出 2 当它应该是三个时可以编辑代码并告诉我为什么它在这些测试用例中出错

【问题讨论】:

  • 为什么只分2次?
  • 您需要嵌套循环。每当数组中无事可做时,外部的就应该停止。内部的:一个检查 all 项是否为偶数,另一个检查是否为 2 if 所有项都是偶数。计算你划分所有项目的次数,如果该次数为 0,则退出外循环。
  • @Breakingnotsobad 为什么要嵌套循环?这不是 0(N*N) 问题。首先检查所有数字是否为偶数,如果是,则将所有数字除以 2。
  • counter=counter/num;的目的是什么?
  • @Breakingnotsobad “如果所有数字都是偶数,则将它们除以 2....” 意味着您必须检查所有数字,然后有条件地采取行动。对不起,但我认为就像工业嵌入式系统工程师一样.在要求中遗漏“小”“无关紧要”的细节有时会导致事故。

标签: c++ algorithm


【解决方案1】:

首先,让我们先用文字写下我们的算法:

  1. 检查当前元素。在开始时,当前元素是第一个元素。
  2. 如果当前元素不能被 2 整除(即x % 2 != 0),那么我们停止
  3. 否则我们将其除以二
  4. 如果还有元素,我们去下一个元素,然后回到1)
  5. 否则,我们会增加计数器,因为所有元素都可以除以 1,并且我们从前面开始

下一步是将其放入代码中。

备注:不要使用 new int[n];对于动态数组。请改用 std::vector。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> numbers;
    int n;
    std::cout << "Enter number of elements:\n";
    std::cin >> n;
    std::cout << "n: " << n << "\n";
    for( int i = 0; i < n; i++ )
    {
        std::cout << "Enter number:\n";
        int temp;
        std::cin >> temp;
        numbers.push_back(temp);
        
    }
    int counter = 0; 
    while( true ) // infinite loop (for 5) )
    {
        for( int i = 0; i < n; i++ ) // 1) and 4)
        {
            if( numbers[i] % 2 != 0 ) // 2) if we can not divide the number by two, we stop
            {
                goto end_loop; // Rare usecase for goto
            }
            else // 3)
            {
                numbers[i] /= 2; 
            }
        }
        counter++; // also 5)
    }
    end_loop: // jump label for go_to
    std::cout << "Maximum possible iterations: " << counter << "\n";
    return EXIT_SUCCESS;
}

由于 Michael 在 cmets 中正确指出,这段代码没有严格遵守规则,这里的版本,只有在所有数字都是偶数时才除以数字:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> numbers;
    int n;
    std::cout << "Enter number of elements:\n";
    std::cin >> n;
    std::cout << "n: " << n << "\n";
    for( int i = 0; i < n; i++ )
    {
        std::cout << "Enter number:\n";
        int temp;
        std::cin >> temp;
        numbers.push_back(temp);
        
    }
    int counter = 0; 
    bool all_even = true;
    for(; all_even; counter++ )
    {
        for( int i = 0; i < n && all_even; i++ ) 
        {
            all_even &= (numbers[i] % 2) == 0;
        }
        for( int i = 0; i < n && all_even; i++ )
        {
            numbers[i] >>= 2;
        }
        
    }
    std::cout << "Maximum possible iterations: " << counter << "\n";
    return EXIT_SUCCESS;
}

【讨论】:

  • 我认为您的代码有问题,因为它不接受任何输入,也没有给我任何输出
  • @golden_hacker 你可以在这里查看代码,它可以工作:onlinegdb.com/FjZ97o44h
  • goto 的罕见用例”实际上是 break 的常见用例。
  • @MichaëlRoy 除了 break 不会跳出嵌套循环。
  • @infinitezero 这可能就是为什么问题指出“如果所有数字都是偶数,然后将它们中的每一个除以 2否则,您将无法执行更多操作”。先检查,如果可能再分。这是一个分解算法。
【解决方案2】:

如果您想要一个真正简单高效的解决方案,那么下面有一个:

#include<iostream>


int main ()
{
    int num { };
    int counter { };

    do
    {
        std::cin >> num;

    } while ( num < 0 ); // checks input to prevent getting a negative number

    if ( num == 0 )
    {
        std::cout << counter << std::endl;

        return 0;
    }

    int* arr = new int [ num ];

    for ( int idx = 0; idx < num; ++idx )
    {
        std::cin >> arr[ idx ];
    }

    for ( bool areAllEven { true }; areAllEven; ++counter )
    {
        for ( int idx = 0; idx < num; ++idx )
        {
            if ( arr[ idx ] % 2 != 0 ) // if not an even number then
            {                          // break the inner loop
                areAllEven = false;
                break;
            }
        }

        if ( areAllEven )
        {
            for ( int idx = 0; idx < num; ++idx )
            {
                arr[ idx ] /= 2;
            }
        }
        else // and here, break the outer loop
        {
            delete[ ] arr;
            arr = nullptr;
            
            break;
        }
    }

    std::cout << counter << std::endl;

    return 0;
}

可以看出,这个解决方案没有臃肿和难以阅读的 C++ 特性,只是为了解决一个非常简单的问题。我认为它对初学者相当友好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2014-01-23
    • 2020-03-16
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多