码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-10-02 21:34:51      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:存在   sam   log   mes   数据   思路   输入数据   include   输入   

一、题目:

“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身。
例如,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");
        }
    }

}

 

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

标签:存在   sam   log   mes   数据   思路   输入数据   include   输入   

原文地址:http://www.cnblogs.com/hhkobeww/p/7622271.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!