又一道简单题
题目描述
输入一个四个数字组成的整数 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
简单的枚举题,通过修改每一位进行判断即可,但是我第一次的解题思路是这样的,N的范围是(1000<=n<=9999),即其满足条件的完全平方数的范围是(sprt(1000)<=X<=sqrt(9999)则其对应整数范围为(31<=X<=100),然后对输入的N进行判断,若abs(N-X)为仅有一位是非零的数
(例如10,200,3000等)则满足条件。
代码如下:
#include<math.h>
#include<stdio.h>
int main()
{
int t,k=0,x,ans,sum,i,j;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&x);
for(i=32;i<=100;i++)
{
ans=abs(x-i*i);
if(ans<10)
sum++;
if(10<=ans&&ans<100&&ans%10==0)
sum++;
if(100<=ans&&ans<1000&&ans%100==0)
sum++;
if(1000<=ans&&ans<10000&&ans%1000==0)
sum++;
}
printf("Case %d: %d\n",++k,sum);
}
return 0;
}
运行结果没问题,测试案例也能通过,但会WA,然后使用了最原始的暴力枚举法,即对每一位进行修改判断,代码如下:
#include<math.h>
#include<stdio.h>
int main()
{
int T,a,ans,k,i,j,b=1,num;
scanf("%d",&T);
while(T--)
{
scanf("%d",&a);
printf("Case %d: ",b++);
num=0;
for(i=1;i<=4;i++)
{
if(i==1)
j=1;
else j=0;
for(;j<=9;j++)
{
if(i==1)
{
ans=j*1000+a%1000;
if(j==a/1000)
continue;
}
else if(i==2)
{
if(j==a/100%10)
continue;
ans=j*100+a/1000*1000+a%100;
}
else if(i==3)
{
if(j==a/10%10)
continue;
ans=j*10+a/100*100+a%10;
}
else
{
if(j==a%10)
continue;
ans=j+a/10*10;
}
k=sqrt(ans);
if(ans==k*k)
num++;
}
}
printf("%d\n",num);
}
return 0;
}