Description
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成0)。比如 n=7844,有两种方法:3844=62^2和 7744=88^2。
Input
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
Output
对于每组数据,输出恰好修改一个数字,把 n 变成完全平方数的方案数。
Sample Input
2 7844 9121
Sample Output
Case 1: 2 Case 2: 0
一点细节没处理好,wa的心碎啊;
注意在替换时,有可能替换的数和原来的数相等,这时相当于没替换。应排除这种情况
AC代码:
#include<cstdio> #include<cmath> int main() { int t,n,cnt,i,j,k,m,ca=1,flag; scanf("%d",&t); while(t--) { cnt=0; scanf("%d",&n); for(i=1;i<=4;i++) { if(i==1) j=1; else j=0; for(;j<=9;j++) { flag=0; //每次让flag=0,只有换成替换的数后使原数变成一个不同的数时flag=1. if(i==1) { k=j*1000+n%1000; if(j!=n/1000) flag=1; } else if(i==2) { k=(n/1000)*1000+j*100+n%100; if(j!=(n/100)%10) flag=1; } else if(i==3) { k=(n/100)*100+j*10+n%10; if(j!=n/10%10) flag=1; } else { k=(n/10)*10+j; if(j!=n%10) flag=1; } if(flag==1) { m=sqrt(k); if(k==m*m) cnt++; } } } printf("Case %d: %d\n",ca++,cnt); } return 0; }