一个数字最多2位数

时间:2014-04-24 07:30:38

标签: c++ loops for-loop integer max

以下是我的尝试中的代码'从用户输入的数字中找到最多2个值:

#include <iostream>
using namespace std;

void maximum2(int a, int& max1,int& max2 ){

int temp = 0;
max2= a%10;
max1 = ((a/10)%10);

if (max2>max1) {
  temp = max1;
  max1 = max2;
  max2 = temp;}
for(; a>0; a/=10){
    if (a%10>max1)max1= a%10;
    else if (a%10<max1 && a%10>max2) max2 = a%10;
}

}
void main(){

int max1, max2, num;
cin>>num;
  maximum2(num,max1,max2);
  cout<<"max 1 = "<<max1<<" max 2 = "<<max2<<endl<<endl;
}

对于大多数数字,它完全正常,例如例如34256除了某些情况。例如,当我输入54321时,它给出max1为5,这是正确的,但它给出max2为1,这不是所需的值。你能帮我跟踪我的错误吗?

4 个答案:

答案 0 :(得分:1)

不是一个直接的解决方案,但可能采用不同的方式来看待事物:

#include <algorithm>
#include <string>
#include <iostream>

int main()
{
  std::string num;  
  std::cin >> num;  

  std::sort(num.begin(), num.end(), std::greater<>{});
    // Or std::greater<char> if your compiler doesn't support the shorter syntax

  std::cout << num[0] << ' ' << num[1] << '\n';
}

如果用户输入0-9以外的字符,显然没什么用处,尽管你总是可以用isdigit解析字符串以删除任何其他字符。

答案 1 :(得分:1)

for循环更改为:

for(; a>0; a/=10){
    int r = a % 10;
    if(r > max2) max2 = r;
    if(max2 > max1) std::swap(max1, max2);
}

原因:在您将当前感兴趣的数字与for进行比较后的max2循环中,您不会将max2max1进行比较检查max1是否需要更新。

核心C ++版本:

for(; a>0; a/=10){
    int r = a % 10;
    if(r > max2) max2 = r;
    if(max2 > max1) {
      int tmp = max2;
      max2    = max1;
      max1    = tmp;
    }
}

答案 2 :(得分:1)

for循环内,您正在更改 max1 max2的值。但是为了让您的代码在所有情况下均可使用,for循环中必须有一个点,您可以在其中更改 max1 的值<和< / strong> max2的价值。

话虽如此,这是一个修复建议:

void maximum2(int a,int& max1,int& max2)
{
    max1 = 0;
    max2 = 0;
    for(; a>0; a/=10)
    {
        int temp = a%10;
        if (temp > max1)
        {
             max2 = max1;
             max1 = temp;
        }
        else if (temp > max2)
        {
             max2 = temp;
        }
    }
}

答案 3 :(得分:1)

您的代码问题在函数

中处于这些条件
if (a%10>max1)max1= a%10;
else if (a%10<max1 && a%10>max2) max2 = a%10;

对于54321这样的数字,else语句将永远不会执行,因为除前两位数外,任何下一位数都大于max1。但即使对于前两位数,else语句也不会执行。

考虑到参数的值可以是负数。

我会按照以下方式编写函数

#include <utility>

//...

std::pair<int, int> maximum2( int x, unsigned int base = 10 )
{
   std::pair<int, int> max( 0, 0 );

   unsigned int z = std::abs( x );

   do
   {
      unsigned int digit = z % base;

      if ( max.first < digit )
      {
         max.second = max.first;
         max.first = digit;
      }
      else if ( max.second < digit )
      {
         max.second = digit;
      }
   } while ( z /= base );

   return max;
}