PAT-B 1091 N-自動番号(15ポイント)


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

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/SKMIT/article/details/113823078