将1、2、3、4、5、6、7、8、9九个数字分成三组,
将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复的数字,也不许同其它组的三个数字重复,要求每组中的三位数整数都是某个整数的平方。 用c++ 来编
参考答案:#include <iostream>
#include <algorith>
#include <vector>
#include <cmath>
using namespace std;
void main()
{
vector<int> a;
double s1,s2,s3;
for (int i=0;i<9;++i){
a.push_back(i+1);
}
do{
s1=a[0]*100+a[1]*10+a[2];
s2=a[3]*100+a[4]*10+a[5];
s3=a[6]*100+a[7]*10+a[8];
if (fabs(sqrt(s1)-(int)sqrt(s1))<1e-5 &&
fabs(sqrt(s2)-(int)sqrt(s2))<1e-5 &&
fabs(sqrt(s3)-(int)sqrt(s3))<1e-5 )
{
printf("%d,%d,%d\n",(int)s1,(int)s2,(int)s3);
}
}while(next_permutation(a.begin(), a.end()));
}
输出:
361,529,784
361,784,529
529,361,784
529,784,361
784,361,529
784,529,361
也就是361,529,784这三组数
------------------
很深奥么?我这么写其实算简单了,说一下吧:
next_permutation(a.begin(), a.end())这个是标准库函数,专门生成全排列的,比如123的全排列有123,132,213,231,312,321这六个
,这个函数也可自己实现,不过那个算法就复杂了
有了全排列后,这样的语句fabs(sqrt(s1)-(int)sqrt(s1))<1e-5就是用来判断一个3位数是否是完全平方,用的是判断开方后的小数点后的数是否小于0.00001来进行的
这下懂了吧