分析下代码
// yanzi.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int isOneSolve(int n, int nMax = 100)
{
int nRet=0; //记录满足本条件数
for (int nd=2; nd*nd<n; ++nd)
{
if ( n%nd==0 && n/nd<nMax)
if (++nRet>1) return 0;
}
return nRet;
}
//条件1,sum的任意和的分拆之积不可能有唯一分解,否则对方可能猜出
//庞涓的条件我们首先可以分析,就是他手里和可以看出,孙的手里面不是素数之积(同时不是素数3次方),可以和合数积或合数与素数之积。同时拆分的组合小于100的组合不小于2.。也就是说把孙手里面的积分解不能是唯一的结果
//燕子在这里处理这个条件。
int p1(int sum)
{
if(sum<6) return 0;
for (int t=(sum-1)/2; t>1; --t)
{
if ( isOneSolve(t*(sum-t)) ) return 0;//一旦出现只能分解一次的情况肯定是素数之积了。。
}
return 1;
}
//条件2,只有一种积的分拆满足条件1
int p2(int times2)
{
int nRet=0; //记录满足本条件数
for (int nd=2; nd*nd<times2; ++nd)
{
if ( times2%nd==0 && p1(nd+times2/nd) )//这里判断是,孙的条件,孙说开始不知道,现在知道了。。
//那么孙的积肯定满足庞涓的条件了,他就用庞涓的条件来检验,同时还要唯一解
//否则他是没办法得到结果的
if (++nRet>1) return 0;
}
return nRet;
}
//条件3,只有一种和的分拆满足条件2
int p3(int sum)
{
int nRet=0; //记录满足本条件数
for (int t=(sum-1)/2; t>1; --t)//孙知道条件了,庞就从孙的思路下推了,只要判断手里面的符合孙的条件就可以了。。同时还要满足唯一性。。否则他还是不知道
{
if ( p2(t*(sum-t)) )
if (++nRet>1) return 0;
}
return nRet;
}
int _tmain(int argc, _TCHAR* argv[])
{
for (int n=6; n<200; ++n) // 从庞涓的条件开始入手,穷举和的可能,最大不超过200
{
// 其和能同时满足条件1和3者即为结果
if (p1(n) && p3(n))
{
//找出对应解
for (int t=2; t*2<n; t++)//这里可以用的是庞的条件,合数积或合数与素数之积t+=2;
{
if ( p2(t*(n-t)) ) //分拆结果符合条件2就输出
printf("%d %d\n", t, n-t);
}
}
}
puts("Finish");getchar();return 0;
return 0;
}
[[it] 本帖最后由 sunkaidong 于 2008-6-12 23:36 编辑 [/it]]
[[it] 本帖最后由 sunkaidong 于 2008-6-12 23:47 编辑 [/it]]