又一道簡單的題
阿新 • • 發佈:2017-09-02
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; }
又一道簡單的題