http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1785
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=62^2和 7744=88^2。
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
对于每组数据,输出恰好修改一个数字,把 n 变成完全平方数的方案数。
2 7844 9121
Case 1: 2 Case 2: 0
根据1000<=n<=9999,可以先算出该范围内的完全平方数,然后再和n对比,只有一个数字不同个数就加一。
写这个的时候有点顾虑会不会出现本身就是完全平方数、改一个数字还是完全平方数的数,于是打印了1000~9999之间的完全平方数,好像没有符合的,于是就遇到有且仅有一个数字不一样的才计入。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define maxn 1111111 int main() { int t=0,i,j,k; int T,cout,c; char n[7],a[100][7]; for(j=0,i=32;i*i<=9999;i++,j++) { a[j][0]=i*i/1000+'0'; a[j][1]=i*i/100%10+'0'; a[j][2]=i*i/10%10+'0'; a[j][3]=i*i%10+'0'; a[j][4]='\0'; // printf("%s\n",a[j]); } scanf("%d",&T); while(T--) { t++; scanf("%s",n); printf("Case %d: ",t); for(c=i=0;i<j;i++) { for(cout=k=0;k<4;k++){ if(n[k]!=a[i][k])cout++; if(cout>1) break;} if(cout==1) c++; } printf("%d\n",c); } return 0; }