素数幻方.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
素数幻方

素数幻方 #include iostream #include string.h #include time.h #include math.h #include algorithm #include windows.h #include stdlib.h #include stdio.h using namespace std; /* 先求出全部的四位可逆素数(204个),以矩阵的行为单位,在四位可逆素数的范围内进行穷举, 然后将穷举的四位整数分解为数字后,再进行列和对角线方向的条件判断,改进的算法与最初 的算法相比,大大地减少了穷举的次数。 考虑矩阵的第一行和最后一行数字,它们分别是列方向四位数的第一个数字和最后一个数字, 由于这些四位数也必须是可逆素数,所以矩阵的每一行和最后一行中的各个数字都不能为偶数或5。 这样穷举矩阵的第一行和最后一行时,它们的取值范围是:所有位的数字均不是偶数或5的四位可 逆数。由于符合这一条件的四位可逆素数很少,所以这一范围限制又一次减少了穷举的次数。 对算法的进一步研究会发现:当设定了第一和第二行的值后,就已经可以判断出当前的这种组合 是否一定是错误的(尚不能肯定该组合一定是正确的)。若按列方向上的四个两位数与四位可逆数 的前两位矛盾(不是其中的一种组合),则第一、二行的取值一定是错误的。同理在设定了前三行 数据后,可以立刻判断出当前的这种组合是否一定是错误的,若判断出矛盾情况,则可以立刻设 置新的一组数据。这样就可以避免将四个数据全部设定好以后再进行判断所造成的低效。 */ bool isPrime(int n);//判断是否为素数 int advert(int n);//将一个正数反过来输出 void change(int a[4][4], int n, int i); //将整形转换成数组 bool contact1(int a[4][4]);//第一行和第二行的联系 bool contact2(int a[4][4]);//前三行的联系 bool contact3(int a[4][4]);//前四行的联系 bool judge(int a[4][4], int n);//判断是否各位都位奇数且不等于5 void print(int a[4][4]);//打印数组 bool isTrue(int a[4][4]);//如果正反对角线也是素数... int b[1000], bLen = 0, digit[1000], dLen = 0; //digit中存放互逆的素数...以减小计算量 //b中存放在digit互逆素数中各位都位奇数且不等于5的数 void main() { int start = GetTickCount();//计时开始 int i, j, k, m, a[4][4] = {0}; int count = 0;//计算个数 for(i = 1001; i 10000; i++)//将四位的互逆素数存放在digit数组中 { int t = advert(i); if(isPrime(i) isPrime(t)) digit[dLen++] = i; } sort(digit, digit + dLen);//将这些数从小到大排列,,当然你也可以不排列 for(i = 0; i dLen; i++) { change(a, digit[i], 0);//将digit中的数分解 if(judge(a, 0))//如果各位都位奇数且不等于5 { b[bLen++] = digit[i]; // coutdigit[i]endl; } } for(i = 0; i bLen; i++) { change(a, b[i], 0);//填充a数组的第1行 for(j = 0; j dLen; j++) { change(a, digit[j], 1); if(!contact1(a))//填充a数组的第2行 continue; for(k = 0; k dLen; k++) { change(a, digit[k], 2);//填充a数组的第3行 if(!contact2(a)) continue; for(m = 0; m bLen; m++) { change(a, b[m], 3);//填充a数组的第4行 if(!contact3(a)) continue; if(isTrue(a)) { count++; print

文档评论(0)

sy78219 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档