要求:
把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
一下写了一个多小时,
下面是我第二次提交的代码(真天才!)
#include<stdio.h>
int main()
{
printf("361 529 784");
}
言归正传,下面是我写了一个多小时,参考了很多博客勉强写出来的
#include <stdio.h>
#include <math.h>
int fe(int i, int sq[10]);//声明函数
void fed(int i, int sq[10]);声明函数
//把1、2、3、4、5、6、7、8、9组合成3个3位数,要求每个数字仅使用一次,使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。
//注意!!!输出的三个数,是由九个不同数字组成的,几每个三位数的百位十位个位都不能相同!!!!!!!!!!!
int main()
{
int arr[1000];//这个数组用来存所有的完全平方数
int sq[10] = {0};
//这个数组用于记录组成每个数字出现的次数,具体请看int fe(int i, int sq[10])函数
int count = 0;//count记录1、2、3、4、5、6、7、8、9组成三位数中的所有完全平方数
for (int i = 123; i <= 987; i++)//123是1、2、3、4、5、6、7、8、9组成的最小三位数,987是1、2、3、4、5、6、7、8、9组成最大的三位数,因为没有0,所以下面剔除了所有含有0的三位数
{
int a = i / 100;
int b = i % 10;
int c = (i / 10) % 10;
if (a == b || b == c || a == c || b == 0 || c == 0)
//剔除了所有含有0的三位数,以及数字重复的三位数
{
continue;
}
double d = sqrt(i);
int e = (int)d * (int)d;
if (e == i)//判断是否为完全平方数
{
arr[count] = i;//完全平方数存入数组
count++;
}
}
for (int i = 1; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
for (int k = j + 1; k < count; k++)
{
if (fe(arr[i], sq) && fe(arr[j], sq) && fe(arr[k], sq))
//判断三个三位数中是否有重复数字
{
printf("%d %d %d", arr[i], arr[j], arr[k]);
}
fed(arr[i], sq);//数组数据归零
fed(arr[j], sq);
fed(arr[k], sq);
}
}
}
}
int fe(int i, int sq[10]) //判断三个三位数中是否有重复数字
{
sq[i / 100]++;
sq[i % 10]++;
int a = i / 10;
sq[a % 10]++;
if (sq[i / 100] == 1 && sq[i % 10] == 1 && sq[a % 10] == 1)
{
return 1;
}
else
{
return 0;
}
}
void fed(int i, int sq[10])//把sq数组不为0的部分归为0
{
sq[i / 100] = 0;
sq[i % 10] = 0;
int a = i / 10;
sq[a % 10] = 0;
}