1. 程式人生 > >1091 N-自守數——C++實現

1091 N-自守數——C++實現

題目

1091 N-自守數 (15 分)

如果某個數 K 的平方乘以 N 以後,結果的末尾幾位數等於 K,那麼就稱這個數為“N-自守數”。例如 3×92​2​​=25392,而 25392 的末尾兩位正好是 92,所以 92 是一個 3-自守數。

本題就請你編寫程式判斷一個給定的數字是否關於某個 N 是 N-自守數。

輸入格式:

輸入在第一行中給出正整數 M(≤20),隨後一行給出 M 個待檢測的、不超過 1000 的正整數。

輸出格式:

對每個需要檢測的數字,如果它是 N-自守數就在一行中輸出最小的 N 和 NK​2​​ 的值,以一個空格隔開;否則輸出 No

。注意題目保證 N<10。

輸入樣例:

3
92 5 233

輸出樣例:

3 25392
1 25
No

演算法

使用字串函式s.substr()擷取計算數字的結尾與原來的資料對應,注意輸入的數字前面如果帶有0,比如044,那麼比對的時候也需要和044比對,而不是和44比對。

除錯了一下,和考試的時候一樣,還是有一個2分的測試點過不去,看到的大神幫忙一下....

原因就是因為應該擷取子串時,s.substr(begin,count)的第一個引數begin是字串的下標位置,從0開始,count是擷取的子字串的長度,因此應該直接擷取到字串結尾才對。註釋部分是原來的,註釋下面是更改的。考試就因為這痛失兩分。

程式碼

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main(){
	int M,j;	scanf("%d",&M);
	for(int i=0;i<M;i++){
		string s,str,sub;
		int tmp,res,lens;	cin>>s;
		tmp=stoi(s);
		lens=s.length() ;	
		for(j=1;j<10;j++){
			str=to_string(int(j*pow(tmp,2)));
			//sub=str.substr(str.length() -lens,str.length() -1) ;
                        sub=str.substr(str.length() -lens) ;
			if(sub==s){
				printf("%ld %ld\n",j,int(j*pow(tmp,2)));
				break;
			}
		}
		if(j==10)	printf("No\n"); 
	}
	return 0;
}