C++ 将标准输出重定向到整数

C++ 将标准输出重定向到整数,c++,iostream,C++,Iostream,我正在解决以下问题: 反转整数的位数。现在这个问题的代码很简单 void reverse(int x){ if(x < 0){ cout << "-"; x*=(-1); } while(x!=0){ cout << x%10; x/=10; } } void反向(int x){ if(x

我正在解决以下问题: 反转整数的位数。现在这个问题的代码很简单

void reverse(int x){
   if(x < 0){
      cout << "-";
      x*=(-1);
   }

   while(x!=0){
      cout << x%10;
      x/=10;
   }
}
void反向(int x){
if(x<0){

cout不要使用
cout
直接显示结果,尝试将结果存储到变量中,比如
rev
,然后返回结果

int reverse(int x)
{    
    bool neg = x < 0;
    int rev = 0;

    while (x != 0) {
        rev = (rev * 10) + (x % 10);
        x /= 10;
    }
    return neg ? -rev : rev;
}
int反转(int x)
{    
布尔负=x<0;
int rev=0;
而(x!=0){
修订版=(修订版*10)+(x%10);
x/=10;
}
返回负?-rev:rev;
}

不要使用
cout
直接显示结果,尝试将结果存储到变量中,比如
rev
,然后返回结果

int reverse(int x)
{    
    bool neg = x < 0;
    int rev = 0;

    while (x != 0) {
        rev = (rev * 10) + (x % 10);
        x /= 10;
    }
    return neg ? -rev : rev;
}
int反转(int x)
{    
布尔负=x<0;
int rev=0;
而(x!=0){
修订版=(修订版*10)+(x%10);
x/=10;
}
返回负?-rev:rev;
}

为什么不创建一个返回int的函数

#include <cmath> // needed for pow()

int reverse(int x)
{    
  int y=0;
  int numDigits=0;
  int x2=x;

  // first count number of digits

  while(x2!=0){
  x2/=10;
  numDigits++;
  }

  // then do the reversion by adding up in reverse direction

  for(int i=0; i<numDigits; i++){
  y+=(x%10)*pow(10,numDigits-i-1);
  x/=10;
  }

  return y;
}
#包括//pow()所需
反向整数(整数x)
{    
int y=0;
int numDigits=0;
int x2=x;
//第一次计数位数
while(x2!=0){
x2/=10;
numDigits++;
}
//然后按相反的方向加起来,进行反向运算

对于(inti=0;i为什么不创建一个返回int的函数

#include <cmath> // needed for pow()

int reverse(int x)
{    
  int y=0;
  int numDigits=0;
  int x2=x;

  // first count number of digits

  while(x2!=0){
  x2/=10;
  numDigits++;
  }

  // then do the reversion by adding up in reverse direction

  for(int i=0; i<numDigits; i++){
  y+=(x%10)*pow(10,numDigits-i-1);
  x/=10;
  }

  return y;
}
#包括//pow()所需
反向整数(整数x)
{    
int y=0;
int numDigits=0;
int x2=x;
//第一次计数位数
while(x2!=0){
x2/=10;
numDigits++;
}
//然后按相反的方向加起来,进行反向运算

对于(int i=0;i您可以使用
std::ostringstream
,保存
std::cout
缓冲区,然后将其转换为int:

void reverse(int x)
{
    std::ostringstream local_buffer;
    auto old_buff = std::cout.rdbuf(local_buffer.rdbuf()); // save pointer to std::cout buffer

    if(x < 0){
        std::cout << "-";
        x*=(-1);
    }

    while(x!=0){
        std::cout << x%10;
        x/=10;
    }

    std::cout.rdbuf(old_buff); // back to old buffer

    int rev = std::atoi(local_buffer.str().c_str());

    std::cout << "rev is: " << rev << "\n";
}
void反向(int x)
{
std::ostringstream本地_缓冲区;
auto old_buff=std::cout.rdbuf(local_buffer.rdbuf());//保存指向std::cout buffer的指针
if(x<0){

std::cout您可以使用
std::ostringstream
,保存
std::cout
缓冲区,然后将其转换为int:

void reverse(int x)
{
    std::ostringstream local_buffer;
    auto old_buff = std::cout.rdbuf(local_buffer.rdbuf()); // save pointer to std::cout buffer

    if(x < 0){
        std::cout << "-";
        x*=(-1);
    }

    while(x!=0){
        std::cout << x%10;
        x/=10;
    }

    std::cout.rdbuf(old_buff); // back to old buffer

    int rev = std::atoi(local_buffer.str().c_str());

    std::cout << "rev is: " << rev << "\n";
}
void反向(int x)
{
std::ostringstream本地_缓冲区;
auto old_buff=std::cout.rdbuf(local_buffer.rdbuf());//保存指向std::cout buffer的指针
if(x<0){

std::cout您可以将其转换为字符串并向后发送到stringstream

std::stringstream s;

std::string s = std::to_string(x);
for (std::string::reverse_iterator rit = s.rbegin(); rit != s.rend(); ++rit) {
    std::cout << *rit;
    ss << *rit;
}
std::cout << std::endl;
return stoi(ss.str());

它使用了0.8秒,比交换数字快了三倍。

您可以将其转换为字符串并向后发送到stringstream

std::stringstream s;

std::string s = std::to_string(x);
for (std::string::reverse_iterator rit = s.rbegin(); rit != s.rend(); ++rit) {
    std::cout << *rit;
    ss << *rit;
}
std::cout << std::endl;
return stoi(ss.str());

它使用了0.8秒,比交换数字快了三倍。

考虑到整数很少被认为或用作数字序列而不是一个值,这并不能真正保证标准库的添加。如果你愿意,你可以制作一个类似于
std::ostringstream
的。你不清楚重定向是什么意思。你能用elabo吗请给它打分。@cheers-sandhth.-Alf例如,在上面的代码中,我必须实际返回一个整数,而不是将其打印到stdout中。“direct”方法是计算具有相反顺序的数字的值,而不是试图截取输出。考虑到整数很少被认为或用作数字序列而不是值,这并不能真正保证标准库的添加。如果您愿意,您可以制作一个类似于
std::ostringstream
。这还不清楚你所说的重定向是什么意思。你能详细说明一下吗?@cheers-sandhth.-Alf例如,在上面的代码中,我必须返回一个整数,而不是将它打印到stdout中。“direct”方法是以相反的顺序计算具有数字的值,而不是试图截取输出。我知道我可以这样做。但我对反转数字不感兴趣,这是一个很小的问题。但将输出重定向到整数。如果您只需要反转整数,则无需预先计算长度;只需m在将输入除以10时,将答案乘以10:
intans=0;而(x){ans=ans*10+(x%10);x/=10;}
(忽略符号:如果需要,您将在开始时记住/正常化,并在结束时应用
ans*=-1
)。我知道我可以这样做。但我对反转数字不感兴趣,这是一个很小的问题。但是将输出重定向到整数。如果您只需要反转整数,则无需预先计算长度;只需将输入除以10时将答案乘以10:
int ans=0;而(x){ans=ans*10+(x%10);x/=10;}
(忽略符号:您应该在开始时记住/正常化,并在需要时在结束时应用
ans*=-1
)。这充其量是不完整的。您的
rev
变量没有符号(仍然打印到STDOUT),函数不断覆盖它,使您只有一个数字,然后您什么也不做。如果(x<0){cout这样做可以修复它吗?在我看来,这似乎是最简单、最快和总体上最好的解决方案。这最多是不完整的。您的
rev
变量没有符号(它仍然打印到标准输出),函数不断覆盖它,使您只有一个数字,然后您什么也不做。如果(x<0){能修复它吗?在我看来,这是最简单、最快、总体上最好的解决方案。