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