C:十进制值

时间:2015-09-20 05:55:55

标签: c numbers reverse

任何人都可以帮我解决一个问题,我必须反转一个数字而不使用数组(int / char)来存储它们。

input1 = 123
output1 = 321
input2 = 2300
output2 = 0032

我正在尝试找到解决方案,但0在打印时被删除,所以我想到了八进制转换,但仍然没有解决方案,所以我使用小数位并且我将23改为0.0032。现在我的问题是如何从该部分提取0032。

有没有可能的方法来实现这一点而不使用数组(int / char),这很容易。

4 个答案:

答案 0 :(得分:2)

你可以使用递归来解决这个问题,而不使用任何数组实际上你也可以在不使用任何使用递归的数组的情况下反转字符串。此代码适用于数字和字符串,并且没有数组:

char reverse(int a)
    {
    char c,d; 
    if(a=='\n') 
        return 0;  
    c=getchar();  
    d=reverse(c);  
    putchar(a);  
    return (c);  
    }  
int main()  
    {  
    char c;  
    scanf("%c",&c);  
    reverse(c);  
}

答案 1 :(得分:0)

开始尝试这个。

int n, l;
char nBuf[126];
n = 1230010;
l = sprintf(nBuf, "%d", n );
while( l >= 0 )
    printf("%c", nBuf[l--] );

虽然如果你从stdin获取输入,则将其作为字符串rathar而不是int或long。

编辑 - 不使用数组

   int n = 123;

        while(n) {
                printf("%d", n%10);
                n/=10;
        }

我假设得到这种类型的值“output2 = 0032”它最好是一个字符串,否则格式化复杂性会随着输入值的长度变化而格式化左侧空间会出现零等等。

答案 2 :(得分:0)

如果你知道你可以代表这样的数字,这就变得相当容易了:

x = a_0 + a_1 * b^1 + a_2 * b^2 + ...
a_i are the digits
b is the base

要提取最低位数,您可以使用余数:x % b 除以基数“删除”最后一位数。这样你就可以得到从最低到最高的数字。

如果您反转数字,则最低值变为最高。看下面的转换,当数字从最高到最低顺序时,很容易看到如何逐步建立一个数字:

x = a_0 + b * (a_1 + b * (a_2 + ...

从0开始,每个数字与基数相乘,然后加上数字。

在伪代码中:

output = 0
while input != 0
  digit = input % base
  input = input / base ;; integer division
  output = output * base + digit
end

如果你想存储前导零,那么你需要将数字存储在一个数组中,或者记住上面循环的步数,输出保持为零:

output = 0
zeros = 0
while input != 0
  digit = input % base
  input = input / base ;; integer division
  output = output * base + digit
  if output == 0
    zeros = zeros + 1
  end
end

要打印,您显然需要打印zeros零,然后打印数字。

实例here,相关代码:

unsigned reverse(
    unsigned input,
    unsigned const base,
    unsigned * const zeros) {
  unsigned output = 0;
  unsigned still_zero = 0;
  for (; input != 0; input/=base) {
    output *= base;
    output += input % base;
    if (output == 0) {
      ++still_zero;
    }
  }
  if (zeros != NULL) {
    *zeros = still_zero;
  }
  return output;
}

void print_zeros(unsigned zeros) {
  for (; zeros != 0; --zeros) {
    printf("0");
  }
}

答案 3 :(得分:0)

递归允许一个简单的解决方案。 @vishu rathore

上的一个小变化
void rev_dec(void) {
  int ch = getchar();
  if (isdigit(ch)) {
    rev_dec();
  }
  if (ch >= 0) putchar(ch);
}

int main(void) {
  rev_dec();
  return 0;
}  

input  
0123456789012345678901234567890123456789
output  
9876543210987654321098765432109876543210