記事のディレクトリ
1.トピック
数Kの2乗にNを掛け、結果の最後の桁数がKに等しい場合、この数は「N-自律数」と呼ばれます。たとえば、3×9 2 2 = 25392 3 \ times 92 ^ {2} = 253923××9 22=2 5 3 9 2、および25392 253922 5 3 9 2最後の2桁は正確にある92 929 2.だから、92 929 2は、 3自律数であります
入力フォーマット:
最初の行に正の整数M(≤20)を入力し、次の行で検出される1000を超えないMの正の整数を入力します。
出力フォーマット:
検出する必要のある番号ごとに、それがN自律型の番号である場合は、最小のNNを連続して出力します。NおよびNK2 NK ^ {2}N K2の値はスペースで区切られます。それ以外の場合は、Noが出力されます。N <10であることを確認するために、質問に注意を払ってください。
入力サンプル:
3
92 5 233
出力サンプル:
3 25392
1 25
なし
2.アイデアと注意事項
(1)特定の番号の最後のn桁を取得するにはどうすればよいですか?
例:
92は2桁で、25392%100を使用して最後の2桁を取得します。
最後のnビットを取得し、1 0 n 10 ^ {n}で除算します。1 0n
したがって、最初に入力の桁数を取得する必要があります
//...
int temp=n;
int count=0; //获取该数的位数
while(temp>0) //获取n的位数
{
temp/=10;
count++;
}
入力にnビットがある場合、除数は次のようになります。
for(int i=0;i<count;i++)
{
v*=10; //取得除数
}
(2)forループについては、N-自律数Nを試してください。
注:
タイトルはN <10を保証しているため、10に循環するだけで済みます。そうしないと、サンプル233でエラーが発生します
(233も自己保存された数値ですが、戻り値は範囲内にありません)
出力「いいえ」です。「いいえ」とは書かないでください。
自律神経係数jを返します。
for(int j=1;j<10;j++)
{
int test=j*n*n;
if(test%v==n)
{
return j;
break;
}
}
3、ACコード
#include<iostream>
#include<cstdio>
using namespace std;
int zishou(int n);
int main()
{
int temp=0;
int N;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>temp;
int k=zishou(temp);
if(k==-1) cout<<"No"<<endl;
else cout<<k<<" "<<temp*temp*k<<endl;
}
}
int zishou(int n)
{
//如果你输入92,那么获得的v为100
int v=1;
int temp=n;
int count=0; //获取该数的位数
while(temp>0) //获取n的位数
{
temp/=10;
count++;
}
for(int i=0;i<count;i++)
{
v*=10; //取得除数
}
for(int j=1;j<10;j++)
{
int test=j*n*n;
if(test%v==n)
{
return j;
break;
}
}
return -1; //如果该数不是自守数,或者是自守数但是返回的数字不在<10的范围内,就返回一个-1;
}