在C中如何使用整数中最左边的数字

时间:2014-03-27 22:35:39

标签: c

我想知道如何将输出反转以匹配输入的数字。 例如,如果用户输入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
输出将是:四个三二一。

我如何解决这个问题:一两三四。

6 个答案:

答案 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 ^(所需数字的索引) 所以我们要做的是

  1. 通过计算log10(值)来获取(剩余)数字的长度。
  2. 然后通过将值除以10 ^ length(长度为1)得到(剩余的)第一个(最重要的)数字。
  3. 计算值:=值 - 10 ^长度并从1开始,除非结果为0(介意数字以0结尾)。

    while (value)
    {
        len    = log10(value);
        digit  = (int) value / pow(10, len);
        value -= pow(10, len);
    }
    
  4. 并且你的代码永远不会进入案例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
             ...   
        }
    }