设计思路
- 把1到9能组合的三位数求出来
- 计算出这些三位数中是完全平方数的部分
int arr[]={1,2,3,4,5,6,7,8,9};
int num;
for (int i = 0; i < 9; ++i) {//找出三个数的完全平方数
for (int j = 0; j < 9; ++j) {
for (int k = 0; k < 9; ++k) {
if(i==j||i==k||j==k){//当每个数字不重复时才能进行下一步
continue;
}
num = arr[i]*100+arr[j]*10+arr[k];
if((int)sqrt(num)* (int)sqrt(num)==num){//组合完成的三位数放到新数组trr中
trr[l++] = num;
}
}
}
}
- 从步骤2所得的数字钟筛选出所需要的数
for (int i = 0; i < l; ++i) {
for (int j = i; j <l; ++j) {
for (int k = j; k < l; ++k) {
int flag =0;
flag = getResult(trr[i],trr[j],trr[k]);//flag==1时表示符合问题的结果
if(flag==1){
printf("%d,%d,%d",trr[i],trr[j],trr[k]);
}
}
}
}
把随机获得的三个三位数拆开放到数组中,判断数组中是否有重复的数字。如果没有则证明符合题目条件,否则继续进行下一轮判断
int getResult(int a,int b,int c){
int arr[9]={0};
for (int i = 0; i < 3; ++i) {
arr[i] = a%10;
a = a/10;
arr[i+3] = b%10;
b = b/10;
arr[i+6] = c%10;
c = c/10;
}
for (int i = 0; i < 9; ++i) {
for (int j = i+1; j <9; ++j) {
if(arr[i]==arr[j]){
return 0; //有重复数
}
}
}
return 1;
}
完整代码
#include <stdio.h>
#include <math.h>
void getNum();
int getResult(int a,int b,int c);
int main(){
getNum();
return 0;
}
void getNum(){
int arr[]={1,2,3,4,5,6,7,8,9};
int trr[9],l;
int num;
for (int i = 0; i < 9; ++i) {//找出三个数的完全平方数
for (int j = 0; j < 9; ++j) {
for (int k = 0; k < 9; ++k) {
if(i==j||i==k||j==k){
continue;
}
num = arr[i]*100+arr[j]*10+arr[k];
if((int)sqrt(num)* (int)sqrt(num)==num){
trr[l++] = num;
}
}
}
}
//输出其中不重复的三个完全平方数
for (int i = 0; i < l; ++i) {
for (int j = i; j <l; ++j) {
for (int k = j; k < l; ++k) {
int flag =0;
flag = getResult(trr[i],trr[j],trr[k]);
if(flag==1){
printf("%d,%d,%d",trr[i],trr[j],trr[k]);
}
}
}
}
}
int getResult(int a,int b,int c){
int arr[9]={0};
for (int i = 0; i < 3; ++i) {
arr[i] = a%10;
a = a/10;
arr[i+3] = b%10;
b = b/10;
arr[i+6] = c%10;
c = c/10;
}
for (int i = 0; i < 9; ++i) {
for (int j = i+1; j <9; ++j) {
if(arr[i]==arr[j]){
return 0; //有重复数
}
}
}
return 1;
}
运行结果: