同構數(“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身)
阿新 • • 發佈:2017-10-02
nbsp amp 所有 div 輸入數據 for 輸入 概念 pre
一、題目:
“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身。
例如,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"); } } }
同構數(“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身)