1091 N-自守数 (15 分)
题目链接
https://pintia.cn/problem-sets/994805260223102976/problems/1071785664454127616
10分答案
#include <bits/stdc++.h>
using namespace std;
bool SubString(int n,int result)
{
string str_n=to_string(n);
string str_result=to_string(result);
if(str_result.find(str_n)==str_result.length()-str_n.length())
return true;
else
return false;
}
int Judge(int n)
{
int i;
for(i=1;i<n;i++)
{
int result=i*n*n;
if(SubString(n,result))
return i;
else
continue;
}
if(i==n)
return 0;
}
int main()
{
int M,N;
scanf("%d",&M);
for(int i=0;i<M;i++)
{
scanf("%d",&N);
if(Judge(N)!=0)
printf("%d %d\n",Judge(N),Judge(N)*N*N);
else
printf("No\n");
}
return 0;
}
12分答案
#include <bits/stdc++.h>
using namespace std;
int main()
{
int M,N;
scanf("%d",&M);
for(int i=0; i<M; i++)
{
scanf("%d",&N);
int flag=0,j,result;
for(j=1; j<10; j++)
{
result=j*N*N;
string str_n=to_string(N);
string str_result=to_string(result);
if(str_result.find(str_n)==str_result.length()-str_n.length())
{
flag=1;
break;
}
}
if(flag)
printf("%d %d\n",j,result);
else
printf("No\n");
}
return 0;
}
15分答案
find()函数是从头开始找子串的,如果找到不是尾巴处的子串就会停止,万一恰好尾巴处正好也是子串,就不满足要求了。
而substr()函数是找到尾巴处确切的子串,相比find()函数而言,的确是更加准确的。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int M,N;
scanf("%d",&M);
for(int i=0; i<M; i++)
{
scanf("%d",&N);
int flag=0,j,result;
for(j=1; j<10; j++)
{
result=j*N*N;
string str_n=to_string(N);
string str_result=to_string(result);
if(str_result.substr(str_result.length()-str_n.length())==str_n)
//if(str_result.find(str_n)==str_result.length()-str_n.length())
{
flag=1;
break;
}
}
if(flag)
printf("%d %d\n",j,result);
else
printf("No\n");
}
return 0;
}