又一道简单题(CSU)

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;
}

猜你喜欢

转载自blog.csdn.net/adusts/article/details/80454309