0

我正在尝试制作一个程序,该程序接受输入的整数并向前读取数字。所以 12345 将是...

Digit: 1
Digit: 2
Digit: 3
Digit: 4
Last Digit: 5

但是,带有尾随零的输入(例如 100000)会遇到问题。在正向中,其中一些零显示为 9,最后一个整数不显示为“最后一位:”。有任何想法吗?

#include <stdio.h>
#include <math.h>
int main(){
    int n = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int output2 = 0;
    int count = 0;

    printf("Number? > ");
    scanf("%d", &n);

    i = n;
    j = n;


    while (i){
        i = i/10;
        count++;
    }


    printf("Foward direction \n");
    while (count > 0){
        k = j;
        k /= pow(10, count - 1);
        output2 = k % 10;
        if (output2 >= pow(10, count - 1)){
            printf("Last digit: %d \n", output2);
        }
        else {
            printf("Digit: %d \n", output2);
        }
        count -= 1;
    }

    return 0;
}
4

4 回答 4

3

如果你想变得聪明、简单和优雅,你总是可以使用递归。

void print_digits(int n)
{
    if (n >= 10) {
        print_digits(n / 10);
    }
    putc('0' + n % 10, stdout);
}

在您的代码中,pow()这是错误的 - 不要尝试使用浮点数来解决有关整数的问题。

编辑:这是为 OP 完成的完整作业,这样@darron 也会很高兴:

void print_digits(int n, int islast)
{
    if (n >= 10) {
        print_digits(n / 10, 0);
    }

    if (islast) {
        printf("Last ");
    }

    printf("Digit: %d\n", n % 10);
}

调用islast参数最初为真(非零):

print_digits(12345, 1);

这会产生

Digit: 1
Digit: 2
Digit: 3
Digit: 4
Last Digit: 5

作为输出。

于 2013-05-02T19:20:22.147 回答
1

正如 H2CO3 和 Cyan 所提到的,pow函数和/或除法运算导致结果不精确。使用浮点运算时很难控制舍入误差(我不知道如何),所以你应该使用整数。

制作一个看起来像pow但适用于整数的函数:

int int_pow(int what, int power)
{
    ...
}

甚至是计算 10 次方的函数:

int pow_of_10(int power)
{
    ...
}

然后用它代替pow.


或者,在第一个循环中计算 10 的最大幂:

while (i){
    i = i/10;
    count++;
    ... // add code here
}

然后用它来计算 10 的较小幂。

于 2013-05-02T19:49:13.983 回答
1

我可能错过了问题的上下文,但这应该可以做到:

#include <stdio.h>
#include <stdlib.h>

struct digit
{
    struct digit *next;
    int value;
};

void print_digits(int value)
{
    struct digit *top = malloc(sizeof(*top));
    top->value = value % 10;
    top->next = NULL;
    value /=10;

    while (value)
    {
        struct digit *p = malloc(sizeof(*p));
        p->value = value % 10;
        p->next = top;
        top = p;
        value /= 10;
    }

    while (top)
    {
        struct digit *p = top;
        top = top->next;
        printf(top ? "Digit: %d\n" : "Last Digit : %d\n", p->value);
        free(p);
    }
}

int main()
{
    print_digits(0);
    print_digits(10);
    print_digits(250);
    print_digits(12345);
    print_digits(100000);
    return 0;
}

输出

Last Digit : 0
Digit: 1
Last Digit : 0
Digit: 2
Digit: 5
Last Digit : 0
Digit: 1
Digit: 2
Digit: 3
Digit: 4
Last Digit : 5
Digit: 1
Digit: 0
Digit: 0
Digit: 0
Digit: 0
Last Digit : 0

或类似的东西。

于 2013-05-02T20:11:01.993 回答
0

如果要避免舍入错误,则不应使用除法、浮点数或 pow 等数学公式。

与其读取十进制数'',不如读取%d一个字符串' %s',然后逐个字符地解析输入数据。

因此,您的第一个数字变为:

digit1 = s[0] - '0';
digit2 = s[1] - '0';

等等

不要忘记检查未经授权的进入,通常使用:while (s[i]>='0' && s[i]<='9')

于 2013-05-02T19:20:36.790 回答