以下是我的尝试中的代码'从用户输入的数字中找到最多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,这不是所需的值。你能帮我跟踪我的错误吗?
答案 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
循环中,您不会将max2
与max1
进行比较检查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;
}