A

 

A. 平方十位数

由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。

这其中也有很多恰好是平方数(是某个数的平方)。

比如:1026753849,就是其中最小的一个平方数。

请你找出其中最大的一个平方数是多少?

注意:你需要提交的是一个10位数字,不要填写任何多余内容。

分析

暴力枚举判断。

 

答案:9814072356

 

思路:

本题可以暴力枚举:

枚举范围可以确定为:[1026753849,9999999999],判断区间内每一个数是否包含0~9这九个数字;

这样的枚举变量范围太大,可以改变枚举变量——枚举平方数的平方根;

可以确定平方根枚举范围为:[30000,100000],平方后判断是否包含0~9这九个数字。

判断平方数是否包含0~9的方法:
设置数组a[10](初始化为0),每次取平方数的个位数d,判断a[d]是否等于1,等于1说明之前存在数d,立即返回0;
否则将a[d]=1;若平方数有机会小于0(即10位数字都没有重复),则可以返回1;

并且本题需要注意的是,不能大意用int类型,因为会超出数据类型的数据范围。

代码:

 

#include <stdio.h>

int judge(long long i)
{
    int a[10]={0};
    int j;
    int ans = 0;
    while(i!=0)
    {
        j=i%10;
        if(a[j]==1)
            return 0;
        a[j]=1;
        ans++;
        i/=10;
    }
    if(ans==10)
        return 1;
    return 0;
}

int main ()
{
    long long i;
    long long max = 0;
    for(i=30000; i<=100000; i++) 
    {
        if(judge(i*i) == 1) 
        {
            if(i*i > max) 
            {
                max = i*i;
            }
        }
    }
    printf("%lld",max);
    return 0;
} 

CODE2

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

typedef long long ll;

bool check(ll x)
{
    int num[10] = { 0 };
    while (x)
    {
        if (num[x % 10]) return false;
        num[x % 10]++;
        x /= 10;
    }
    return true;    
}

int main()
{
    ll t1 = sqrt(9876543210); // 组成十位最大的 
    ll t2 = sqrt(1023456789); // 组成十位最小的 
    for (ll i = t1; i >= t2; i--)
    {
        if (check(i * i))
        {
            cout << i * i << endl;
            break;
        }
    }
    return 0;
}

 

posted @ 2021-03-29 23:33  Leo-aiolia-bao  阅读(62)  评论(1编辑  收藏  举报