LQ0009 平方十位数枚举

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0009 平方十位数枚举相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2017决赛

题目描述
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?

输出格式
输出一个整数表示答案

问题分析
这个题用枚举来解决,一种是枚举数,其平方为10位数,再判定是否正好覆盖数字0-9;另外一种是枚举0-9的数字构成的数,然后判定该数是否为平方数。枚举0-9数字可以使用置换函数prev_permutation()来实现。
不论哪一种枚举,都是从大到小再做判定。
这个题算出的结果是9814072356。

先求枚举的范围,数字的平方为10位数,编写以下C语言离线程序:

/* LQ0009 平方十位数 离线计算用于计算值的范围 */

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

char s[16];

int main()

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

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

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

    return 0;

上述程序计算的结果是"31623 99999",那么结果应该是31623到99999之间的平方数,从大到小寻找到覆盖0-9数字的数即得到结果。确定有解的话,有最大数就够了。为了保险起见,在这2个数的范围内答案。

AC的C语言程序如下:

/* LQ0009 平方十位数 */

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

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

int main()

    for (long long i = 99999; i >= 31623; i--) 
        sprintf(s, "%lld", 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("%lld\\n", i * i);
            break;
        
    

    return 0;

AC的C++语言程序(枚举0-9数字)如下:

/* LQ0009 平方十位数 */

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>

using namespace std;

bool issquare(long long n)

    long long t = sqrt(n);
    if (t * t == n) return true;
    else return false;


int main()

    char s[] = "9876543210";
    do 
        if (issquare(atoll(s))) 
            cout << s << endl;
            break;
        
     while (prev_permutation(s, s +10));

    return 0;

以上是关于LQ0009 平方十位数枚举的主要内容,如果未能解决你的问题,请参考以下文章

LQ0203 排它平方数枚举+进制

LQ0027 四平方和枚举

LQ0006 奇妙的数字暴力

LQ0006 奇妙的数字暴力

LQ0150 回文日期枚举

LQ0018 顺子日期枚举+日期