【问题标题】:Trying to remove each digit from my output, like a right triangle试图从我的输出中删除每个数字,就像一个直角三角形
【发布时间】:2021-01-18 14:07:13
【问题描述】:

我正在尝试让我的程序删除每一行的最后一个数字。

我被困在哪里,不明白为什么 number = number % 10 在第二个 for 循环中不起作用?

#include <stdio.h>
#include <math.h>
    
int main(){
    long long number;
    
    printf("Enter a number\n");
    printf("Enter your number = ");
    scanf("%d", &number);
    
    for(int j=1; j<= (log10(number)+1); j++){
        for(int i=1; i<= (log10(number)+1); i++){
            printf("%d   ", (number%((int)pow(10, i)))/(int)pow(10, i-1));
        }
        printf("\n");
    }
    
    return 0;
}

我的输出:

Enter a number
Enter your number = 12345
5   4   3   2   1
5   4   3   2   1
5   4   3   2   1
5   4   3   2   1
5   4   3   2   1

我要输出的内容:

Enter a number
Enter your number = 12345
5   4   3   2   1
5   4   3   2
5   4   3
5   4
5   

【问题讨论】:

  • 您调用了未定义的行为,方法是使用%d 并将long long* 而非预期的int* 传递给scanf()number = number % 10 也不在您发布的代码中。请发帖Minimal, Reproducible Example
  • number = number % 10 打破了number,所以它在内循环中是有害的,除非number 中的数据保存在其他地方。
  • 但是 %d 有问题吗?它似乎没有影响它。我应该创建一个新变量吗?
  • %d 有问题。 I got wrong result。但它与number = number % 10 没有直接关系。
  • %lld 应该用于读取long long。可以通过将i&lt;= (log10(number)+1) 更改为i&lt;= (log10(number)+1) - (j - 1) 来完成删除。

标签: c loops for-loop numbers printf


【解决方案1】:

在第二个for 循环中执行number = number % 10 是个坏主意,因为它会破坏number 中的数据。

要删除数字,您应该减少要在内循环中打印的数字。

这意味着

    for(int j=1; j<= (log10(number)+1); j++){
        for(int i=1; i<= (log10(number)+1); i++){

应该是

    for(int j=1; j<= (log10(number)+1); j++){
        for(int i=1; i<= (log10(number)+1) - (j-1); i++){

这样内循环中的迭代按照j减少。

还要注意

long long number;
scanf("%d", &number);

调用未定义的行为,因为scanf() 中的%d 需要int*,但传递了long long* 而不是那个。

要通过scanf() 阅读long long,您应该使用%lld

long long number;
scanf("%lld", &number);

【讨论】:

  • 感谢您的帮助,这只是帮助我解决了我遇到的问题。
  • 我也在猜测 printf("%d ", (number%((int)pow(10, i)))/(int)pow(10, i-1));还需要将“%d”更改为“%11d”吗?
  • 啊,应该也是%lld(不是%11d
  • 是的,只是将其更改为“%lld”
【解决方案2】:

我建议附加其他答案作为使用递归函数(不调用任何数学函数)输出给定数字的替代解决方案。

这是一个演示程序。

#include <stdio.h>

FILE * output( unsigned long long n, FILE *fp )
{
    const unsigned long long Base = 10;
    
    if ( n / Base != 0 )
    {
        output( n / Base, fp );
        fprintf( fp, "   " );
    }
    
    fprintf( fp, "%llu", n % Base );

    return fp;
}

int main(void) 
{
    const unsigned long long Base = 10;
    
    while ( 1 )
    {
        printf( "Enter a non-negative number (0 - exit): " );
        
        unsigned long long n;
        
        if ( !( scanf( "%llu", &n ) == 1 ) || ( n == 0 ) ) break;
        
        putchar( '\n' );
        
        do
        {
            fputc( '\n', output( n, stdout ) );
        } while ( n /= Base );
        
        putchar( '\n' );
    }
    
    return 0;
}

程序输出可能看起来像

Enter a non-negative number (0 - exit): 987654321

9   8   7   6   5   4   3   2   1
9   8   7   6   5   4   3   2
9   8   7   6   5   4   3
9   8   7   6   5   4
9   8   7   6   5
9   8   7   6
9   8   7
9   8
9

Enter a non-negative number (0 - exit): 0

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2022-09-26
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多