注册 登录
编程论坛 C++教室

[求助]c++查找满足特定条件的三位数

jibatian 发布于 2007-06-27 15:44, 1396 次点击
特定条件:一个三位数的平方是一个六位数字,那么这个三位数和它的平方共有9个数字。要满足这9个数字恰好是1到9,没有重复。要求编写多个函数分别实现上述功能,而后在main函数中进行调用。
4 回复
#2
HJin2007-06-27 17:35
回复:(jibatian)[求助]c++查找满足特定条件的三位数...

/*---------------------------------------------------------------------------
File name: Square_3digits.cpp
Author: HJin
Created on: 6/27/2007 02:23:03
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762


Modification history:

Analysis:

Do a brute force search for all th 9! permutations of 1..9.
We want to search a permuatation of 1..9 (stored in a[0..8])
so that

(a_0 a_1 a_2)^2 = (a_3 a_4 a_5 a_6 a_7 a_8).


Sample output:

567 * 567 = 321489
854 * 854 = 729316
Press any key to continue . . .

*/

#include <iostream>
#include <algorithm>
using namespace std;


int a[9];
void search();

int main(int argc, char** argv)
{
search();

return 0;
}

void search()
{
int n_3digits;
int n_6digits;
int i;

for(i=0; i<9; ++i)
{
a[i] = i+1;
}

// the first case 1 2 3 4 5 6 7 8 9 is omitted.
while(next_permutation(a, a+9))
{
n_3digits = 10* (10*a[0] + a[1]) + a[2];
n_6digits = 0;

for(i=3; i<9; ++i)
{
n_6digits = 10 * n_6digits + a[i]; // Horn's rule
}

if(n_3digits * n_3digits == n_6digits)
{
for(i=0; i<3; ++i)
cout<<a[i];
cout<<" * ";
for(i=0; i<3; ++i)
cout<<a[i];
cout<<" = ";
for(i=3; i<9; ++i)
cout<<a[i];

cout<<endl;
}
}
}

#3
xq07142007-06-27 17:52
LS签名牛!给的代码也牛,佩服!
#4
terisevend2007-06-28 22:12

我也写了个。。。顺便问问HJin,“next_permutation(a, a+9)”这函数原型是什么?有什么用处。。。?
根据单词意思,是排序的意思。是对数组进行一次排序,并返回是否排序成功的布尔值吗?
以下是我写的。。。思路就是通过对1-9进行排列组合并比较。。。

#include <cstdlib>
#include <iostream>

using namespace std;

void sort_search( int[], int st, int ed );

int main(int argc, char *argv[])
{
int num[9];

for( int i = 0; i < 9; i++ )
num[i] = i+1;


int st = 0, ed = 8;

sort_search( num, st, ed );

system("PAUSE");
return EXIT_SUCCESS;
}

inline void m_sort( int &d1, int &d2 )
{
int tmp;
tmp = d1;
d1 = d2;
d2 = tmp;
}


void sort_search( int n[], int st, int ed )
{
int k;
if( st == ed )
{
int s = 10*( 10*n[0]+n[1] ) + n[2], p = 0;

for( int k = 3; k <= ed; k++ )
p = 10*p + n[k];

if( s*s == p )
cout << s <<" * " << s << " = " << p << endl;

}

else
for( k = st; k <= ed; k++ )
{
m_sort( n[k], n[st] );
sort_search( n, st+1, ed );
m_sort( n[k], n[st] );
}
}


[此贴子已经被作者于2007-6-28 22:17:09编辑过]

#5
野比2007-07-01 23:00

next_permutation是排序用的, 还有prev_permutation
在algorithm库里..

1