题目描述
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=622 和 7744=882。
输入
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
输出
对于每组数据,输出恰好修改一个数字,把 n变成完全平方数的方案数
样例输入
2
7844
9121
样例输出
Case 1: 2
Case 2: 0
分析
暴力枚举,但是有些小技巧,因为一定是四位数,所以容易找出所有的完全平方数
31*31=916
32*32=1024
…………
99*99=9801
100*100=10000
将这些数用数组标记遍历的时候直接判断
参考代码
#include <iostream> #include <math.h> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int main() { int T; int n; int sum=0; int num=1; char s[5];//输入的四位数 bool v[10001];//标记数组 memset(v,false,sizeof(v)); for(int i=32;i<100;i++){ v[i*i]=true;//把四位数的完全平方数标记下来 } scanf("%d",&T); while(T--){ sum=0; scanf("%s",s); n=atoi(s);//字符串转整型 for(int k=1000,i=0;i<4;k/=10,i++){//遍历改变字符串的第i位 for(int j=0;j<=9;j++){ /*i==0&&j==0是首位变成0的情况 s[i]-'0'==j是n不变的情况 */ if((i==0&&j==0)||(s[i]-'0'==j)){ continue; } else if(v[n-(s[i]-'0'-j)*k]){ sum++; } } } printf("Case %d: %d ",num++,sum); } return 0; }