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

[求助]哪位能详解一下这个程序

jibatian 发布于 2007-07-01 18:19, 499 次点击

让您见笑了.

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

void main()
{
int a[9],n,s,i;
for(i=0;i<9;++i)
{
a[i]=i+1;
}

while(next_permutation(a,a+9))
{
n=10*(10*a[0]+a[1])+a[2];
s=0;
for(i=3;i<9;++i)
{
s =10*s+a[i]; }
if(n*n==s)
{
for(i=0;i<3;++i)
cout<<a[i];
cout<<"'s square is ";
for(i=3;i<9;++i)
cout<<a[i];
cout<<endl;
}
}
}

4 回复
#2
terisevend2007-07-01 19:20
https://bbs.bc-cn.net/viewthread.php?tid=150758&star=at
你的这程序和这里的一样,解决的就是这里的问题。而这贴中3楼的程序我写的。
首先,就是定义一个数组,并且里面存有1-9。
然后后面的那个while。。。就是用来判断1-9的全部排序是否已经排完了(我的理解。。。因为我写的那个就是有用到求得所有排序,而且,那permutation的字面了解就是排序。)
如果没排完,就获得一个与前面所求得的序列不重复的序列。然后便取其前3个数据组成一个三位数,并且判断其平方是否与后6个数据组成的6位数相等,如果相等,输出他们。
而我的程序的思路与这大致相同,都是对1-9的所有排序进行分析判断。。。

[此贴子已经被作者于2007-7-1 19:22:13编辑过]

#3
天空の城2007-07-01 19:26
以下是引用terisevend在2007-7-1 19:20:24的发言:
https://bbs.bc-cn.net/viewthread.php?tid=150758&star=at
你的这程序和这里的一样,解决的就是这里的问题。而这贴中3楼的程序我写的。
首先,就是定义一个数组,并且里面存有1-9。
然后后面的那个while。。。就是用来判断1-9的全部排序(其实应该说是全排列,并不是sort一样的排序)是否已经排完了(我的理解。。。因为我写的那个就是有用到求得所有排序,而且,那permutation的字面了解就是排序。)
如果没排完,就获得一个与前面所求得的序列不重复的序列。然后便取其前3个数据组成一个三位数,并且判断其平方是否与后6个数据组成的6位数相等,如果相等,输出他们。
而我的程序的思路与这大致相同,都是对1-9的所有排序进行分析判断。。。

#4
terisevend2007-07-01 20:01
谢谢天空の城的指教,顺便指教一下,next_permutation的原理。谢谢···
#5
天空の城2007-07-02 14:14
原理我也不清楚,代码在下面。

template<class _BI> inline
bool next_permutation(_BI _F, _BI _L)
{
    _BI _I = _L;
    if (_F == _L || _F == --_I)
        return (false);
    while(1)
    {
        _BI _Ip = _I;
        if (*--_I < *_Ip)
        {
            _BI _J = _L;
            while(!(*_I < *--_J));
            iter_swap(_I, _J);
            reverse(_Ip, _L);
            return (true);
        }
        if (_I == _F)
        {
            reverse(_F, _L);
            return (false);
        }
    }
}
1