又一道简单题

又一道简单题

题目描述

输入一个四个数字组成的整数 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值