LQ0006 奇妙的数字暴力

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0006 奇妙的数字暴力相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2015初赛 C++ A组C题,Java C组A题

题目描述
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?

输出格式
请输出该数字,不要输出任何多余的内容。

问题分析
先求枚举的范围,数字的平方和立方连起来10位,编写以下C语言离线程序:

/* LQ0006 奇妙的数字 离线程序,用于算值范围 */

#include <stdio.h>
#include <string.h>

char s[16];

int main()

    int i = 1, start, end;
    for (; ; i++) 
        sprintf(s, "%d%d", i * i, i * i *i);
        if (strlen(s) >= 10) 
            start = i;
            break;
        
    

    for (i++; ; i++) 
        sprintf(s, "%d%d", i * i, i * i *i);
        if (strlen(s) > 10) 
            end = i - 1;
            break;
        
    

    printf("%d %d\\n", start, end);

    return 0;

运行上述程序,输出“47 99”,所以枚举47-99即可。

编写连线程序,枚举47-99的数字,判定数字的平方和立方连起来是否唯一覆盖0-9的每一个数字。

题记
程序解题,有时候离线程序是必要的。

AC的C语言程序如下:

/* LQ0006 奇妙的数字 */

#include <stdio.h>
#include <string.h>

char s[10 + 1];
int cnt[10];

int main()

    for (int i = 47; i <= 99; i++) 
        sprintf(s, "%d%d", i * i, i * i * i);

        memset(cnt, 0, sizeof cnt);
        for (int j = 0; s[j]; j++)
            cnt[s[j] - '0']++;

        int flag = 1;
        for (int i = 0; i < 10; i++)
            if (cnt[i] != 1) 
                flag = 0;
                break;
            

        if (flag)
            printf("%d\\n", i);
    

    return 0;

上述程序运行结果是输出69。

以上是关于LQ0006 奇妙的数字暴力的主要内容,如果未能解决你的问题,请参考以下文章

LQ0162 立方尾不变枚举

LQ0156 立方变自身枚举

奇妙的数字

LQ0007 数列求值递推

LQ0007 数列求值递推

LQ0112 立方和进制