2912:三个完全平方数
总时间限制: 1000ms 内存限制: 65536kB
描述
将1,2,…,9分成3组,每组3个数,组内数字不重复,组间的数字也不重复。
组内的3个数字可任意排列,组成一个三位数。
已知这3个数都是完全平方数,求这3个数。
输入
输入一个MAX
输出
如果求出的三个数a,b,c均小于MAX,则输出:
a b c
否则输出小于MAX的数:
a b
或者
a
注意:
1,a,b与b,c之间各有空格一个。最后一个数之后没有空格。
2,应该满足a小于b小于c。
样例输入
无
样例输出
无
问题链接:Bailian2912 三个完全平方数
问题简述:(略)
问题分析:
先枚举所有的平方数,这些平方数只能是13-31之间的平方数。然后再枚举三个平方数。
本题用枚举法实现,需要用到进制原理。求出的3个是361,529和784。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C语言程序如下:
/* Bailian2912 三个完全平方数 */
#include <stdio.h>
#include <string.h>
#define START 13
#define END 31
int num[END + 1];
void init()
{
int i;
memset(num, 0, sizeof(num));
for(i = START; i <= END; i++) {
num[i] = i * i;
int d1 = num[i] / 100, d2 = num[i] / 10 % 10, d3 = num[i] % 10;
if(d1 == d2 || d2 == d3 || d3 == d1) num[i] = 0;
}
}
int judge(int a, int b)
{
char t1[4], t2[4];
sprintf(t1, "%d", a);
sprintf(t2, "%d", b);
int i, j;
for(i =0; i < 3; i++)
for(j = 0; j < 3; j++)
if(t1[i] == t2[j]) return 0;
return 1;
}
int main(void)
{
init();
int max;
scanf("%d", &max);
int i, j, k, flag = 1;
for(i = START; i <= END && flag; i++)
if(num[i]) {
for(j = i + 1; j <= END && flag; j ++)
if(num[j] && judge(num[i], num[j])) {
for(k = j + 1; k <= END && flag; k++)
if(num[k] && judge(num[i], num[k]) && judge(num[j], num[k])) {
if(num[k] < max) {
printf("%d %d %d", num[i], num[j], num[k]);
} else if(num[j] < max) {
printf("%d %d", num[i], num[j]);
} else if(num[i] < max) {
printf("%d", num[i]);
}
flag = 0;
}
}
}
return 0;
}