找到小于给定整数的最大有趣数字

Posted

技术标签:

【中文标题】找到小于给定整数的最大有趣数字【英文标题】:Find the largest interesting number smaller than a given integer 【发布时间】:2017-03-05 00:28:59 【问题描述】:

如果翻转后的数字可以被它所包含的位数整除,那么它就会很有趣。所以程序应该从 SI 中读取一个 ingeter n(n>9)。 找到并打印小于 n 的最大有趣数字。如果输入数字无效,则应打印“无效输入”。 所以这是我编写的代码,但我无法让它工作。 我恳请一些帮助。 提前致谢

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

int main()

    int n, flippedNumber=0, remainder;
    int count = 0, i;
    scanf ("%d", &n);
    int largestInteresting = n;
    while ( n != 0)
    
        n /= 10;
        ++count;
    
    while (n > 9)
    
        for (i = 0; i < n; i++)
        
            remainder = n%10;                       
            flippedNumber = flippedNumber*10 + remainder;
            n /= 10;
        
        --largestInteresting;
    
    if ((flippedNumber % count) == 0 && largestInteresting > i)
        printf ("%d", largestInteresting);
    else
        printf ("Invalid input");
    return 0;

【问题讨论】:

这是什么作用?有一件事是你的第一个while循环一直运行到n == 0,而你的第二个循环永远不会运行,因为n永远不会大于9 当发布的代码运行时,用户会看到一个闪烁的光标,并且没有指示用户下一步应该做什么。建议每次用户需要输入任何内容时输出一个提示。该提示应该告诉用户输入的范围和类型。 在第一个while()循环结束时,'n'将为0。那么第二个while()循环将永远不会进入。 为了便于阅读和理解: 1) 变量名应该指示用法或内容(或者更好,两者兼有)。 2) 遵循公理:每行只有一个语句,并且(最多)每条语句有一个变量声明。 3) 单独的代码块(for、if、else、while、do...while、switch , case, default) 通过一个空行。 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。 【参考方案1】:

您的代码存在问题:您有效地破坏了n 进行数字计数,但随后尝试将其重用于其他用途而不刷新其值(形成最大的有趣?);您不会在循环中对输入数字进行倒数计数,因此您永远找不到所需的数字;等到循环完成后再进行有趣的数字测试,但如果你倒计时,一旦找到第一个有趣的数字,就不需要完成循环。

我下面的返工结合了我上面的扭曲解释以及一些风格调整:

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

int main()

    int number;

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

    if (number < 10)
    
        fprintf(stderr, "Invalid input\n");
        return EXIT_FAILURE;
    

    for (int n = number; n > 9; n--)
    
        int digitCount = 0;
        int temporary = n;

        while (temporary != 0)
        
            temporary /= 10;
            ++digitCount;
        

        int flippedNumber = 0;
        temporary = n;

        for (int i = 0; i < digitCount; i++)
        
            int remainder = temporary % 10;
            flippedNumber = flippedNumber * 10 + remainder;
            temporary /= 10;
        

        if ((flippedNumber % digitCount) == 0)
        
            printf("%d\n", n);
            return EXIT_SUCCESS;
        
    

    fprintf(stderr, "No interesting numbers found!\n");     
    return EXIT_FAILURE;

示例用法

> echo 10 | ./a.out
No interesting numbers found!
> echo 100 | ./a.out
89
> echo 1000 | ./a.out
999
> echo 10000 | ./a.out
8899
> echo 100000 | ./a.out
59999
> echo 1000000 | ./a.out
899997
> 

【讨论】:

以上是关于找到小于给定整数的最大有趣数字的主要内容,如果未能解决你的问题,请参考以下文章

*LeetCode-136 只出现一次的数字(有趣)

有趣的数字游戏

有趣的排序

(百度17春招笔试题)有趣的排序

一道有趣的广度优先搜索/动态规划的题

有趣的数字图形