省赛模拟一 又一道简单题
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1785
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=62^2和 7744=88^2。
Input输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
Output对于每组数据,输出恰好修改一个数字,把 n 变成完全平方数的方案数。
Sample Input2 7844 9121Sample Output
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;
}