问题 C: 又一道简单题
题目描述
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=622 和 7744=882。
输入
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
输出
对于每组数据,输出恰好修改一个数字,把 n变成完全平方数的方案数
注意本身不算在内,还有保证最高位不为0,采用打表去判断,数据不是很多,将每位分别去判断
#include<bits/stdc++.h>
#define swap(x, y) {int temp=x;x=y;y=temp;}
using namespace std;
const int N=1005;
int s[N];
int a[N];
int ai=0;
int judge(int x)
{
for(int j=0;j<ai;j++){
if(x==a[j]){
return 1;
}
}
return 0;
}
int slove(int n)
{
int ans=0;int tp=1;
for(int i=0;i<4;i++)
{
if(i==0)
tp=1;
else
tp=tp*10;
// cout<<tp<< " ";
int num=n-s[i]*tp;
for(int j=0;j<=9;j++)
{
if(s[i]==j||i==3&&j==0)
{
continue;
}
// cout<<"num="<<num<<"+"<<j*tp<<" ";
if(judge(num+j*tp))
{
ans++;
}
}
}
return ans;
}
int main()
{
for(int i=31;i<100;i++){
a[ai++]=i*i;
// cout<<i*i<< " ";
}
int t;
scanf("%d",&t);
for(int i=0;i<t;++i)
{
int n;
scanf("%d",&n);
int x=n,cnt=0;
while(x)
{
s[cnt++]=x%10;
//cout<<x%10<<" ";
x/=10;
}
printf("Case %d: %d\n",i+1,slove(n));
}
return 0;
}