又一道简单的题

题目描述

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

分析

暴力枚举,但是有些小技巧,因为一定是四位数,所以容易找出所有的完全平方数

31*31=916

32*32=1024

…………

99*99=9801

100*100=10000

将这些数用数组标记遍历的时候直接判断

参考代码

#include <iostream>
#include <math.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int main()
{
    int T;
    int n;
    int sum=0;
    int num=1;
    char s[5];//输入的四位数
    bool v[10001];//标记数组
    memset(v,false,sizeof(v));
    for(int i=32;i<100;i++){
        v[i*i]=true;//把四位数的完全平方数标记下来
    }
    scanf("%d",&T);

    while(T--){
        sum=0;
        scanf("%s",s);
        n=atoi(s);//字符串转整型
        for(int k=1000,i=0;i<4;k/=10,i++){//遍历改变字符串的第i位
            for(int j=0;j<=9;j++){
        /*i==0&&j==0是首位变成0的情况
          s[i]-'0'==j是n不变的情况
        */
                if((i==0&&j==0)||(s[i]-'0'==j)){
                    continue;
                }
                else if(v[n-(s[i]-'0'-j)*k]){
                    sum++;
                }
            }
        }
        printf("Case %d: %d\n",num++,sum);
    }
    return 0;
}

 

posted @ 2017-09-02 10:05  路人姜。  阅读(476)  评论(0编辑  收藏  举报