stoll 函数(c++11 字符串)给出不明确的输出
stoll function(c++11 string) giving ambiguous output
我遇到了这个问题:
https://www.urionlinejudge.com.br/judge/en/problems/view/1193
/*input
3
101 bin
101 dec
8f hex
*/
/*************************************************************
* Purpose : https://www.urionlinejudge.com.br/judge/en/problems/view/1193
* Author: Sahil Arora
* Version: 1.0
* Date: 22/10/15
* Bugs : None
*************************************************************/
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
/* code */
std::ios_base::sync_with_stdio(false);
int test;
cin>>test;
for(int i=1;i<=test;++i){
cout<<"Case "<<i<<":\n";
string str,base;
long long num,j;
cin>>str>>base;
if(base=="dec"){
num = stoll(str,nullptr);
cout<<hex<<num<<" hex\n";
bitset<32> bin(num);
for(j=31;bin[j]==0 && j>=0;--j)
;
while(j>=0)
cout<<bin[j--];
cout<<" bin\n\n";
}
else if(base=="hex"){
str = "0x" + str;
num = stoll(str,nullptr,16);
cout<<dec<<num<<" dec\n"; // <--focus on this line
bitset<32> bin(num);
for(j=31;bin[j]==0 && j>=0;--j)
;
while(j>=0)
cout<<bin[j--];
cout<<" bin\n\n";
}
else{
num = stoll(str,nullptr,2);
cout<<dec<<num<<" dec\n"<<hex<<num<<" hex\n\n";
}
}
return 0;
}
现在将第 45 行更改为:
cout<<num<<" dec\n";
我对 hex
的输出发生了变化。它给出的输出与 hex
到 dec
的输入相同。我不明白为什么会出现这样的错误。另外,如果我只输入 1 个测试用例,它会给出 hex
的正确输出,但在提交时仍然给出 20% 的错误答案!
输入:
3
101 bin
101 dec
8f hex
预期输出:
Case 1:
5 dec
5 hex
Case 2:
65 hex
1100101 bin
Case 3:
143 dec
10001111 bin
我在 cout
中不使用 dec
的输出:
Case 1:
5 dec
5 hex
Case 2:
65 hex
1100101 bin
Case 3:
8f dec
10001111 bin
我认为您的程序行为是预期的,与 stoll 本身无关。
因此,std::hex
、std::dec
(和std::oct
)是修改输出基数的操纵器。一旦应用,它们将不会重置(例如,这会将它们从 std::setw
更改)。这就是为什么每次要更改输出基础时都应该重新应用操纵器。
所以你只需要写
std::cout<<std::dec<<num<<" dec\n";
因为您可能已经申请了
std::cout<<std::hex<<num<<" hex\n";
早些时候
我遇到了这个问题: https://www.urionlinejudge.com.br/judge/en/problems/view/1193
/*input
3
101 bin
101 dec
8f hex
*/
/*************************************************************
* Purpose : https://www.urionlinejudge.com.br/judge/en/problems/view/1193
* Author: Sahil Arora
* Version: 1.0
* Date: 22/10/15
* Bugs : None
*************************************************************/
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
/* code */
std::ios_base::sync_with_stdio(false);
int test;
cin>>test;
for(int i=1;i<=test;++i){
cout<<"Case "<<i<<":\n";
string str,base;
long long num,j;
cin>>str>>base;
if(base=="dec"){
num = stoll(str,nullptr);
cout<<hex<<num<<" hex\n";
bitset<32> bin(num);
for(j=31;bin[j]==0 && j>=0;--j)
;
while(j>=0)
cout<<bin[j--];
cout<<" bin\n\n";
}
else if(base=="hex"){
str = "0x" + str;
num = stoll(str,nullptr,16);
cout<<dec<<num<<" dec\n"; // <--focus on this line
bitset<32> bin(num);
for(j=31;bin[j]==0 && j>=0;--j)
;
while(j>=0)
cout<<bin[j--];
cout<<" bin\n\n";
}
else{
num = stoll(str,nullptr,2);
cout<<dec<<num<<" dec\n"<<hex<<num<<" hex\n\n";
}
}
return 0;
}
现在将第 45 行更改为:
cout<<num<<" dec\n";
我对 hex
的输出发生了变化。它给出的输出与 hex
到 dec
的输入相同。我不明白为什么会出现这样的错误。另外,如果我只输入 1 个测试用例,它会给出 hex
的正确输出,但在提交时仍然给出 20% 的错误答案!
输入:
3
101 bin
101 dec
8f hex
预期输出:
Case 1:
5 dec
5 hex
Case 2:
65 hex
1100101 bin
Case 3:
143 dec
10001111 bin
我在 cout
中不使用 dec
的输出:
Case 1:
5 dec
5 hex
Case 2:
65 hex
1100101 bin
Case 3:
8f dec
10001111 bin
我认为您的程序行为是预期的,与 stoll 本身无关。
因此,std::hex
、std::dec
(和std::oct
)是修改输出基数的操纵器。一旦应用,它们将不会重置(例如,这会将它们从 std::setw
更改)。这就是为什么每次要更改输出基础时都应该重新应用操纵器。
所以你只需要写
std::cout<<std::dec<<num<<" dec\n";
因为您可能已经申请了
std::cout<<std::hex<<num<<" hex\n";
早些时候