Description
输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=62^2和 7744=88^2。
Input
输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。
Output
对于每组数据,输出恰好修改一个数字,把 n 变成完全平方数的方案数。
Sample Input
2 7844 9121
Sample Output
Case 1: 2 Case 2: 0
问题分析:先用数组T[n]把四位数的完全平方数存起来,接着把整数的四位数分别求出并用a,b,c,d存起来,然后依次对a进行1-9的改变其他三位不变,判断组成的新的整数是否T[n]中的一个数相等,有相等的ans+1;bcd同里进行相同操作(从0-9)。
代码:
#include <iostream>
using namespace std;
int main() {
int t[110];
for(int i = 32; i <= 100; i++) {
t[i] = i*i;
}
int n, x, i, q, b, s, g, ans;
cin>>n;
for(int i = 1; i <= n; i++) {
ans = 0;
cin>>x;
q = x/1000;
b = x/100%10;
s = x/10%10;
g = x%10;
//千位
for(int j = 1; j <= 9; j++) {
if(j==q) continue;
int temp = 1000*j + b*100 + s*10 + g;
for(int k = 32; k <= 100; k++) {
if(t[k]==temp) {
ans++;
break;
}
}
}
//百位
for(int j = 0; j <= 9; j++) {
if(j==b) continue;
int temp = 1000*q + j*100 + s*10 + g;
for(int k = 32; k <= 100; k++) {
if(t[k]==temp) {
ans++;
break;
}
}
}
//十位
for(int j = 0; j <= 9; j++) {
if(j==s) continue;
int temp = 1000*q + b*100 + j*10 + g;
for(int k = 32; k <= 100; k++) {
if(t[k]==temp) {
ans++;
break;
}
}
}
//个位
for(int j = 0; j <= 9; j++) {
if(j==g) continue;
int temp = 1000*q + b*100 + s*10 + j;
for(int k = 32; k <= 100; k++) {
if(t[k]==temp) {
ans++;
break;
}
}
}
cout<<"Case "<<i<<": "<<ans<<endl;
}
return 0;
}