【解決方法】この課題を解決するにはどうすればよいですか


Given a natural number k (1≤k≤18), we need to find the smallest square number with k digits, where each digit is also a square number.

Input:

The number of test cases t (0<t<10^3).
For each test case, input a natural number k.
Output:

Each line corresponds to a test case and prints the found number. If no number is found, print -1.
Example:
Input:
2
1
3

Output:
1
100

私が試したこと:

#include<iostream>
#include<cmath>
using namespace std;

int scp(int n){
    int can = sqrt(n);
    if (can * can == n)
        return 1;
    else
        return 0;
}

long long find(int k){
    if (k > 18){
        return -1;
    }

    long long socantim = 0;
    for (int i = 0; i < k; i++){
        int khoitao = 1;
        while (!scp(khoitao)){
            khoitao++;
        }
        socantim = socantim * 10 + khoitao;
    }

    if (socantim == 0){
        return -1;
    }

    return socantim;
}

int main(){
    int t;
    cin >> t;
    while (t--){
        int a;
        cin >> a;
        cout << find(a) << endl;
    }
    return 0;
}

解決策 1

私たちは行き詰まっている人々を喜んで助けますが、それは私たちがあなたのためにすべてを行うためにここにいるという意味ではありません。 私たちがすべての仕事を行うことはできません。あなたはこれに対してお金をもらっているか、成績の一部であり、私たちがあなたのためにすべてを行うのはまったく公平ではありません。

したがって、私たちはあなたに仕事をしてもらう必要があります。あなたが行き詰まったときは、私たちがお手伝いします。 それは、あなたが提出できる段階的な解決策を提供するという意味ではありません。
まず、自分が現在どこにいるのか、そしてプロセスの次のステップは何なのかを説明します。 次に、次のステップを実行するために何を試みたか、また実行したときに何が起こったかを教えてください。

まずは課題を注意深く読み、知っておくべきことを理解してから、手動で実行してみてください。 「各桁は平方数でもある」ということと、18 桁の数値は int にまったく収まらないことを覚えておいてください。

それはあなた次第です。
幸いなことに、何が起こっているかを調べるのに役立つツール、デバッガーが利用可能です。 使用方法はコンパイラ システムによって異なりますが、IDE の名前と「デバッガ」を Google で検索すると、必要な情報が得られるはずです。

関数の最初の行にブレークポイントを設定し、デバッガーでコードを実行します。 次に、コードとデータを調べて、手動で何が起こるかを考えます。 次に、各行を 1 ステップずつ実行して、期待したことが実際に起こったかどうかを確認します。 そうでない場合は、問題が発生しているときなので、前に戻って (またはもう一度実行して詳しく調べて) 理由を調べることができます。

申し訳ありませんが、私たちはそれを行うことはできません。新しい (そして非常に便利な) スキルであるデバッグを学ぶ時期です。

解決策 2

ヒント1:もし k奇数 それから10k-1 が解決策です。
それから、 の値 k:
ヒント 2: が必要です 64-bit 最大の数値を保持する整数 18 数字。
ヒント 3: 正方形を生成する構築によって解決できるかもしれません。

コメント

タイトルとURLをコピーしました