我想知道如何将输出反转以匹配输入的数字。
例如,如果用户输入543210
,我希望输出为:Five Four Three Two One Zero
。但相反它却被逆转了,我无法弄清楚如何扭转它。
我不能使用循环或其他任何东西。
代码:
int main(void){
int value;
int digit;
printf("enter:");
scanf("%i", &value);
while(value)
{
digit = value % 10;
value = value / 10;
if(digit != 0)
{
switch(digit)
{
case 0:
printf("zero ");
break;
case 1:
printf("one ");
break;
case 2:
printf("two ");
break;
case 3:
printf("three ");
break;
case 4:
printf("four ");
break;
case 5:
printf("five ");
break;
case 6:
printf("six ");
break;
case 7:
printf("seven ");
break;
case 8:
printf("eight ");
break;
case 9:
printf("nine ");
break;
}
}
}
return 0;
}
例如:如果用户输入了1234
输出将是:四个三二一。
我如何解决这个问题:一两三四。
答案 0 :(得分:2)
由于您已经说过不允许使用循环,因此递归确实是您可能希望使用的东西。我个人不确定将递归视为循环是否正确,无论如何。
你在那里使用while
,这也是一个循环。如果 允许使用循环,那么您可以在代码中执行以下操作,易于理解的修改,并获得所需的输出:
...
int input; // <-- added this
int value;
int digit;
printf( "enter:" );
scanf( "%i", &input ); // <-- notice the change in variable usage
value = 0;
while ( input ) {
value = 10 * value + input % 10; // adds the last digit of input to value from right
input /= 10;
}
while ( value ) { ... }
...
如果您不允许使用循环,那么您可能需要使用特殊函数,该函数为单个案例输出特定值,并在任何其他情况下返回自身。你需要一个递归函数。检查这个简单的例子:
// This is in maths, not C
f(x) = 2x + 1 for all integer x >= 0
在很多方面,这是描述将0
映射到1
,然后1
映射到3
,然后n
映射到{的功能的一种方式{1}}。如果我们想要定义完全相同的函数recursively:
2n + 1
你看到那里发生了什么?它说每个后续// In maths
f(x = 0) = 1 for x = 0
f(x > 0) = f(x-1) + 2 for integer x > 0
比前一个f(x)
大2 f(x-1)
。但更重要的是,这个功能正在呼唤自己!如果你仔细观察,被调用的函数f(x-1)
也会调用自己:
f(x) = f(x-1) + 2
f(x) = f(x-2) + 2 + 2
f(x) = f(x-3) + 2 + 2 + 2
...
// all these are the same
所有这些越来越深的呼唤必须在某个地方结束,而某个地方就是f(x-...)
为f(0)
时,已明确定义为1
。
这就是递归的全部意义所在。让我在C中写出我上面给出的例子:
// non-recursive version
int fnonrec( int x ){
return 2 * x + 1;
}
// recursive version
int frec( int x ){
if ( x == 0 )
return 1; // explicit return value for f(0)
else // redundant else, hehe
return frec( x - 1 ) + 2;
}
函数的定义看起来与数学中的定义类似,不是吗?是的,好吧,我不认为给你答案你的问题对我很好。我只能说你可以用递归函数反向打印相反的东西。
答案 1 :(得分:1)
//将用户输入存储到int
变量&#34; value
&#34;
char str[15];
sprintf(str, "%d", value);
然后,您可以使用strrev
函数来反转字符串数组。从那里操纵它。
答案 2 :(得分:0)
#include <stdio.h>
void print(int v){
static char *numbers[] = {
"zero","one","two","three","four",
"five","six","seven","eight","nine"
};
int digit = v % 10;
int value = v / 10;
if(value){
print(value);
printf(" %s", numbers[digit]);
} else
printf("%s", numbers[digit]);
}
int main(void){
int value;
printf("enter:");
scanf("%i", &value);
print(value);
return 0;
}
答案 3 :(得分:0)
使用递归函数和参数中的数字的示例:
#include <stdio.h>
void display(char c)
{
char *numbers[] = {
"zero","one","two","three","four",
"five","six","seven","eight","nine "
};
printf("%s ", numbers[c]);
}
int aff_num(char *c)
{
if (*c == '\0')
return (0);
display(*c-48);
aff_num(++c);
return (1);
}
int main(int argc, char **argv)
{
if (argc < 2)
{
printf("Need numbers\n");
return (-1);
}
aff_num(argv[1]);
return (0);
}
答案 4 :(得分:0)
我是一名蟒蛇黑客,而且我几乎从不用C编程说:
#include <stdlib.h>
#include <stdio.h>
int highest_power_of_ten(int value){
int exponent = 0;
int tens = 1;
while(value > tens){
tens *= 10;
exponent += 1;
}
return exponent-1;
}
int pow(int base, int exponent){
if (exponent == 0)
return 1;
int temp = base;
while(exponent > 1){
base *= temp;
exponent -= 1;
}
return base;
}
int main(int argc, char** argv){
char* digits[] =
{"zero","one","two","three","four","five","six","seven","eight","nine"};
int value, n, exp, x;
scanf("%i", &value);
while(highest_power_of_ten(value)>0){
exp = highest_power_of_ten(value);
x = pow(10, exp);
n = value/x;
printf("%s ",digits[n]);
value -= n*x;
}
printf("%s\n", digits[value]);
//system("PAUSE"); for windows i guess
return 0;
}
答案 5 :(得分:-1)
以正确顺序获取数字的另一种方法:
E.g。要获得123中第一个位置的数字除以123除以100,得到第二个 - 123/10,得到第三个123 / 1.等于:值/ 10 ^(所需数字的索引) 所以我们要做的是
计算值:=值 - 10 ^长度并从1开始,除非结果为0(介意数字以0结尾)。
while (value)
{
len = log10(value);
digit = (int) value / pow(10, len);
value -= pow(10, len);
}
并且你的代码永远不会进入案例0.要解决这个问题,只需留下if(数字!= 0) - 这就是我写的时候的意思&#34;记住0&#34;)。< / p>
if(digit != 0) // enters if digit is not 0
{
switch(digit)
{
case 0: // enters if digit is 0
...
}
}