【发布时间】:2011-01-22 00:23:08
【问题描述】:
我正在寻找 C 程序来反转如下数字:
如果我输入:
123456
那么结果就是:
654321
请帮帮我。
【问题讨论】:
-
请学习如何聪明地回答问题。
-
看起来像一个著名的“C”面试题:-)
-
你现在正在接受采访吗?那我们还是赶紧解决你的问题吧。
我正在寻找 C 程序来反转如下数字:
如果我输入:
123456
那么结果就是:
654321
请帮帮我。
【问题讨论】:
这是这个复杂问题的简单解决方案:
#include <stdio.h>
int main()
{
int ch;
ch = getchar();
if (ch != '\n') {
main();
printf("%c", ch);
}
}
#include <stdio.h>
#include <stdlib.h>
static void newline(void)
{
printf("\n");
}
int main()
{
int ch;
ch = getchar();
if (ch != '\n') {
main();
printf("%c", ch);
} else {
atexit(newline);
}
}
【讨论】:
main。
如果您的教授对您的表现进行评分,请在另一个问题中尝试ggf31416's solution 解决此问题:
int FastReverse(int num) {
int res = 0;
int q = (int)((214748365L * num) >> 31);
int rm = num - 10 * q;
num = q;
if (rm == 0) return -1;
res = res * 10 + rm;
while (num > 0) {
q = (int)((214748365L * num) >> 31);
rm = num - 10 * q;
num = q;
res = res * 10 + rm;
}
return res;
}
绝对,肯定必须在这一纳秒内完成。
【讨论】:
if (rm == 0) return -1; 行。在这种情况下,给定 1200,它将返回 21。使用前导零进行格式化将是高阶函数的职责。
使用% 10 获取最后一位数字。输出它。将数字除以 10 得到除最后一位以外的所有数字。使用% 10 获取最后一位数字。以此类推,直到数字变为0。
【讨论】:
char buf[12]; snprintf(buf, 16, "% 10d", n); for ( size_t i = 10; i --> 0 && buf[i] > 42; ) printf("%c", buf[i]);
这是另一种可能性。它是非递归的,也许代码少一点。代码cmets中有一个例子来说明逻辑。
/*
Example: input = 12345
The following table shows the value of input and x
at the end of iteration i (not in code) of while-loop.
----------------------
i | input | x
----------------------
0 12345 0
1 1234 5
2 123 54
3 12 543
4 1 5432
5 0 54321
----------------------
*/
uint32_t
reverseIntegerDigits( uint32_t input )
{
uint32_t x = 0;
while( input )
{
x = 10 * x + ( input % 10 );
input = input / 10;
}
return x;
}
【讨论】:
使用scanf("%s", A) 或者更好的是使用fgets 读取字符数组A 中的数字,并通过输出从strlen(A) - 1 到0 开始的每个字符来输出反转的字符数组。
【讨论】:
strrev 函数反转字符串。如果性能不是问题,那么例如您可以执行 itoa,然后是 strrev,然后是 atoi。 但是即使没有 strrev,任务也很简单。
【讨论】:
看起来像一个非常古老的线程。但是我在这里提到了解决方案,并且在测试了本网站上作为解决方案可用的不同程序之后,不得不编写自己的解决方案。我意识到如果数字以零结尾,将数字视为 int 不会产生必要的数字反转。所以我决定把这个数字当作一个字符串,然后把数字颠倒过来。这样,从字符串的角度来看,我得到了数字的精确反转,而不是在数字开头丢弃零的数学数字。
#include <stdio.h>
#include <string.h>
main()
{
char num[20];
int x=0,slen;
printf("Enter the number you want to reverse :");
scanf("%s",num);
slen=strlen(num);
char *pointertoarray = &num[slen];
for (x=slen;x>=0; x--){ printf("%c",*pointertoarray); pointertoarray--; }
printf("\n");
}
【讨论】:
使用幂函数。
while(count>=1)
{
var = num % 10;
sum = sum + var * pow(10, count - 1);
num =num / 10;
count--;
}
【讨论】: