Répertoire d'articles
1. Sujet
Si le carré d'un nombre K est multiplié par N et que le nombre de chiffres à la fin du résultat est égal à K, alors ce nombre est appelé "nombre N-autonome". Par exemple, 3 × 9 2 2 = 25392 3 \ times 92 ^ {2} = 253923×9 22=2 5 3 9 2 et25392 253922 5 3 9 2 Les deux derniers chiffres sont exactement92 929 2. Donc92 929 2 est un nombre 3-autonome
Format d'entrée:
Entrez un entier positif M (≤20) dans la première ligne et M entiers positifs ne dépassant pas 1000 à détecter dans la ligne suivante.
Format de sortie:
Pour chaque nombre à détecter, s'il s'agit d'un nombre N-autonome, émettez le plus petit NN d'affiléeN etNK 2 NK ^ {2}N KLa valeur de 2 est séparée par un espace; sinon, Non est affiché. Faites attention à la question pour vous assurer que N <10.
Échantillon d'entrée:
3
92
5233 Échantillon de sortie:
3 25392
1 25
Non
2. Idées et précautions
(1) Comment obtenir les n derniers chiffres d'un certain nombre?
Par exemple:
92 a 2 chiffres, puis utilisez 25392% 100 pour obtenir les deux derniers chiffres.
Récupère les n derniers bits et divise par 1 0 n 10 ^ {n}1 0n
donc nous devons d'abord obtenir le nombre de chiffres dans l'entrée
//...
int temp=n;
int count=0; //获取该数的位数
while(temp>0) //获取n的位数
{
temp/=10;
count++;
}
Si l'entrée a n bits, le diviseur est
for(int i=0;i<count;i++)
{
v*=10; //取得除数
}
(2) Pour la boucle, essayez le nombre N-autonome N
Note: Les
garanties titre que N <10, donc nous avons seulement besoin pour passer à 10, sinon l'échantillon 233 fera une erreur.
(233 est également un certain nombre conservé soi, mais la valeur de retour est pas dans la plage) La
sortie est "Non", n'écrivez pas "NON" ";
Renvoie le coefficient autonome j.
for(int j=1;j<10;j++)
{
int test=j*n*n;
if(test%v==n)
{
return j;
break;
}
}
Trois, code 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;
}