我遇到了这个问题: 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
我的输出未使用dec
中的cout
:
Case 1:
5 dec
5 hex
Case 2:
65 hex
1100101 bin
Case 3:
8f dec
10001111 bin
答案 0 :(得分:2)
我相信你的程序行为是预期的,与stoll本身无关。
因此,std::hex
,std::dec
(和std::oct
)是修改输出库的操纵器。一旦应用,它们将不会重置(例如,它会从std::setw
更改它们)。这就是为什么每次想要改变输出基数时都应该重新应用操纵器。
所以你只需要写
std::cout<<std::dec<<num<<" dec\n";
因为你可能已经申请了
std::cout<<std::hex<<num<<" hex\n";
早些时候