1091 N-自守數——C++實現
阿新 • • 發佈:2018-12-11
題目
1091 N-自守數 (15 分)
如果某個數 K 的平方乘以 N 以後,結果的末尾幾位數等於 K,那麼就稱這個數為“N-自守數”。例如 3×922=25392,而 25392 的末尾兩位正好是 92,所以 92 是一個 3-自守數。
本題就請你編寫程式判斷一個給定的數字是否關於某個 N 是 N-自守數。
輸入格式:
輸入在第一行中給出正整數 M(≤20),隨後一行給出 M 個待檢測的、不超過 1000 的正整數。
輸出格式:
對每個需要檢測的數字,如果它是 N-自守數就在一行中輸出最小的 N 和 NK2 的值,以一個空格隔開;否則輸出
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; }