从C中的整数中提取数字?

时间:2014-10-13 21:45:28

标签: c

void print(int num, int digits)
{
    double mod, divi;
    int mod1, divi1;
    mod = pow(10, digits);
    divi = pow(10, digits-1);
    mod1 = (int)mod;
    divi1 = (int)divi;

    if(digits > 0)
    {
        printf("%d\n", ((num%mod1)/divi1));
        digits--;
        print(num, digits);
    }
    else
    {
        return;
    }
}

此功能用于垂直打印'num'中的数字,但是当我运行它时,它打印的唯一内容是0。我知道它得到正确的位数,因为它打印的数字与数字中的数字相同,所以我在这里使用Modulo或Division时出现问题,我似乎无法找到它。任何帮助将不胜感激,谢谢!

获取数字的功能(可能问题在这里?):

void getNum()
{   
int num, digits=0;
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);

if(num < 0)
{
    digits = 1;
}
while(num)
{
    num = num/10; //Here was the problem. Num was 0 once i passed it to print()
    digits++; //Simply added a new variable to fix it. Thanks all!
}
print(num, digits);

}

3 个答案:

答案 0 :(得分:1)

我没有看到你的代码有什么问题,除了它太复杂并且不必要地使用浮点数学。

这是另一种选择:

void print(int num, int digits)
{
    if (digits > 0) {
        print(num / 10, digits - 1);
        printf("%d\n", num % 10);
    }
}

诀窍是在递归调用之后移动打印。这允许更简单的逻辑。

答案 1 :(得分:0)

这是我的问题的解决方法。在将num传递给函数之前,我将num设置为0。我只是声明了另一个变量num1在while循环中使用,而不是传递给函数的实际num。

void getNum()
{   
int num, num1, digits=0;
//get the num
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);
num1 = num;

//Loop to find how many digits are in the number
while(num1)
{
    num1 = num1/10;
    digits++;
}
//call function to print
print(num, digits);

}

答案 2 :(得分:0)

NPE answer上所做的改动很小,我可以找到消除digits参数并适用于负数的代码版本。


代码

void print(int num)
{
    if (num < 0){
        num *=-1; 
    }

    if (num > 0) {
        print(num / 10);
        printf("%d\n", num % 10);
    }
}

[Edit1 and 2] 正确的INT_MIN溢出

感谢chux提出的建设性意见,我更正了INT_MIN否定溢出的可能。 Another similar topic by chux

void print(int num)
{

    #if INT_MIN < -INT_MAX
    ///In two's complements systems.
    ///handle special case

    if ( num == INT_MIN ) {
      //fprintf(stderr, "Houston, we have a problem\n");

      // Maybe return or exit here.
      //~ 2147483647 -> 2147483648
      print(INT_MAX/10);
      print(INT_MIN%10); //portable version ///print(8);
      return;
    }

    if (num < 0){   
            //num =-((unsigned)num);
            num *=-1; 
    }

    #endif  

    if (num > 0) {
        print(num / 10);      
        printf("%d\n",  num%10);
    }

}

现在,如果我们拨打print()

int number = INT_MIN;// a negative number

print(-120);
printf("\n");
print(-321);

print(number);

输出

1
2
0

3
2
1
Houston, we have a problem

[Edit3]

更改代码使其也可以print(0)使用。

int zeroSignal=1;

void print(int num)
{

    #if INT_MIN < -INT_MAX
    ///In two's complements systems.
    ///handle special case

    if ( num == INT_MIN ) {
      ///fprintf(stderr, "Houston, we have a problem\n");
      // Maybe return or exit here.
      //~ 2147483647 -> 2147483648
      print(INT_MAX/10);
      print(INT_MIN%10); //portable version ///print(8);
      return;
    }

    if (num < 0){   
            //num =-((unsigned)num);
            num *=-1; 
    }

    #endif  


    if (num==0 && zeroSignal){
        printf("Only zero: %d\n", 0);
    }

    if (num > 0) {
        zeroSignal = 0;
        print(num / 10);
        printf("%d\n",  num%10);
    }

    zeroSignal = 1;      
}

在上面的代码中,我使用全局整数zeroSignal来实现一种适用于print(0)的方式。