1. 程式人生 > >同構數(“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身)

同構數(“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身)

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");
        }
    }

}

同構數(“同構數”是指這樣一種數,這個數右端的數平方後會得到這個數本身)