1. 程式人生 > >又一道簡單的題

又一道簡單的題

9*9 cst pac name urn 參考 方案 turn 組成

題目描述

輸入一個四個數字組成的整數 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; }

又一道簡單的題