同构数(“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同构数(“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身)相关的知识,希望对你有一定的参考价值。

一、题目:

“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身。
例如,5是25 右边的数,25是625右边的数,25和625都是同构数。找出a ~ b之间全部同构数。 Input 有多组数据,第一行一个正整数t(t<100)表示输入数据组数,接下来有t组输入数据,每组数据占一行,
包含两个整数a、b,0<=a<=b<=1000000 Output 对于一组数据,输出可能有多个,每一组输出占一行,不要输出多余空格。 Sample Input 1 1 100 Sample Output 1 25 36 Hint 5776 = 76 * 76 也是同构数

二、解题分析:(超级重要)

1、仔细读题理解 “同构数”的概念

2、不能用 int , 因为 int 范围是10e9,当遍历时去判断符合条件的数时,相乘就会爆掉。

3、a 和 b 的范围是在  0 到 100万,暴力解决时要注意 0 也是一个 同构数

4、思路:① 可以找到 0 到 100万之间所有的同构数,打表存,之后在给定的范围 a ~~ b中塞选属于此范围的数存到一个新的数组,      再输出。

      ② 枚举暴力,不打表,直接将0~~100万之间的数存在数组中,之后塞选存到新的数组,再输出。

三、代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
typedef long long ll;
using namespace std;

ll vis[5]={10,100,1000,10000,100000};
ll lis[10005];
ll ans[10005];

int main()
{
    ///打表
    int num=0;
    for(ll i=0;i<1000000;i++)
    {
        for(int j=0;j<5;j++)
        {
            ll cnt=i%vis[j];
            if(cnt*cnt == i)
            {
                lis[num++]=i;
                break;
            }
        }
    }

    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll a,b;
        scanf("%lld%lld",&a,&b);
        int n=0;
        memset(ans,0,sizeof(ans));
        for(int i=0;i<num;i++)
        {
            if(lis[i]>=a&&lis[i]<=b)
            {
                ans[n++]=lis[i];
            }
        }
        for(int i=0;i<n;i++)
        {
            printf("%lld",ans[i]);
            if(i!=n-1)
                printf(" ");
            else
                printf("\n");
        }
    }

    return 0;
}

 

 

//暴力 枚举
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
    int a[8]={0,1,25,36,625,5776,141376,390625};//0~~1000000所有的同构数
    int b[10];
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(b,0,sizeof(b));
        int m,n;
        scanf("%d%d",&m,&n);
        int count=0;
        for(int i=0;i<8;i++)
        {
            if(a[i]>=m&&a[i]<=n)
            {
                b[count++]=a[i];
            }
            if(a[i] > n) break;
        }

        for(int i=0;i<count;i++)
        {
            printf("%d",b[i]);
            if(i!=count-1)
                printf(" ");
            else
                printf("\n");
        }
    }

}

 

以上是关于同构数(“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身)的主要内容,如果未能解决你的问题,请参考以下文章

Python识别同构数

C语言,编写一个函数,判断某个数是不是为同构数。然后在主函数中输出2~99内的同构数。

异或运算--01---arr中,只有一种数出现了K次,其他数都出现了M次

51nod1780 完美序列

听说有种数叫水仙花?

美术-同构图形:百科