同构数(“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身)
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"); } } }
以上是关于同构数(“同构数”是指这样一种数,这个数右端的数平方后会得到这个数本身)的主要内容,如果未能解决你的问题,请参考以下文章
C语言,编写一个函数,判断某个数是不是为同构数。然后在主函数中输出2~99内的同构数。