我正在尝试解决this problem。
我用字符串实现它。这是我的代码片段
string s,ss;
// s and ss both contains integer input.
while(s <= ss )
//while( s<=ss && s.size() <= ss.size())
{
int i = inc, j = dec; // inc and dec are middle values. both equal if odd else different
while((s[j]-'0')==9 && i < len && j>=0){
// for cases like 999
s[i] = s[j] = '0';
i++;
j--;
}
if(j<0){
s = "1" + s;
int l = s[len-1] - '0';
l++;
//cout<<l<<"\n";
s[len] = (l + '0');
}
else{
int l = s[j] - '0';
l++;
s[i] = s[j] = (l+'0');
}
if(s <= ss)
cout<<"out in wild "<<s<<" and "<<ss<<"\n";
}
cout<<s<<endl;
我面临的问题是当输入类似于999或9999.即使s
的值增加,外部while循环也会继续循环,但如果我添加while( s<=ss && s.size() <= ss.size())
它完全正常。为什么while(s <= ss)不起作用?我很少使用string
类,所以我完全不理解它。为什么string s= 101
和ss=99
不会停止while循环?
完整的代码链接是here
答案 0 :(得分:4)
您正在将字符串与lexicographical order进行比较,而非数字,因此“101”小于“99”(因为“1”<9'),例如
int main(){
std::string s = "99";
std::string ss = "101";
std::cout << std::boolalpha << (s <= ss);
}
输出false
。
备注:强>
为您的程序设计一个更好的设计是操纵数字(int
或double
...)而不是首先处理字符串,所以这种表达式自然会起作用你期待。
E.g。 “101”+“99”是“10199”,而不是“200”......
但如果您确实需要字符串,请考虑this post对包含数字的字符串进行排序。
正如@Deduplicator所指出的,一个不必要地过度使用字符串的程序有时被称为Stringly Typed
由于您的输入明确只涉及正整数而没有前导0 ,因此编写比较函数是微不足道的,例如:(未经测试)
/* Returns 1 if the integer represented by s1 > the integer represented by s2
* Returns -1 if the integer represented by s1 < the integer represented by s2
* Return 0 is both are equals
*
* s1 and s2 must be strings representing positive integers without trailing 0
*/
int compare(const std::string& s1, const std::string& s2)
{
if(s1.size() > s2.size())
return 1;
if(s2.size() > s1.size())
return -1;
for(std::size_t i = 0 ; i < s1.size() ; ++i)
{
if(s1[i] - '0' < s2[i] - '0')
return 1;
if(s2[i] - '0' < s1[i] - '0')
return -1;
}
return 0;
}
答案 1 :(得分:0)
虽然 s 和 ss 是字符串变量,但它们会逐个字符地进行比较。
如果你提到:s = "101"
&amp; ss = "99"
,第一只手会检查每个字符串中的第一个字符,而'1' < '9'
则会使用 s &lt; SS 。我会建议你在比较之前将这些值转换为整数。
答案 2 :(得分:0)
当s与字典顺序中的ss进行比较时,我建议你将尾部的一个字符与头部的一个字符(逐个到达中间)进行比较以解决该问题。