整数连接、欧几里得算法、尼姆博弈.docVIP

整数连接、欧几里得算法、尼姆博弈.doc

  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文档。上传文档
查看更多
设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3个整数12,345,678,连成的最大整数为 想法1:根据第一位来比,否则比第二位?特例:121,12或者123,12 王艳欣:先把所有整数位数统一,再从大到小排序。 想法2:所以可能情况列举出来?时间复杂度:O(n!) (结合起来:先总体上排序,排序的标准根据这两个数组成数的大小(大的在前,小的在后),时间复杂度:O(n2),甚至可改进到O(nlog2n)。(不好证明,但是可测试一些特殊数据,如果通过基本上就OK了。) ===============题目要求是n个数,得两两比较============= /* 3 13 312 343 4 7 13 4 246 */ #include stdio.h #include string.h /* 转化成字符串格式来比较 */ int str_cmp(char s1[],char s2[]) { char t1[81]=,t2[81]=; strcat(t1,s1); strcat(t1,s2); strcat(t2,s2); strcat(t2,s1); return(strcmp(t1,t2)); } void main() { int num[20],n,i,j; /* 假定不超过20个数,每个数不超过10位 */ char s[20][10],temp[10]; printf(Input n:); scanf(%d,n); for (i=0;in;i++) { scanf(%d,num[i]); itoa(num[i],s[i],10); } for (i=0;in-1;i++) for (j=i+1;jn;j++) if (str_cmp(s[i],s[j])0) { strcpy(temp,s[i]); strcpy(s[i],s[j]); strcpy(s[j],temp); } for (i=0;in;i++) printf(%s,s[i]); getch(); } 总结:如果想直接从数的构成来比较,比如abc和xyz进行比较,相应算法: 从高到低每位进行比较,较大的在前面; 若出现位数不等的情况:而前若干位如n位又刚好相同,如abcd和ab的情况,比较方法(abcdab还是ababcd?):对较长的整数进行分析,若第n+1位大于第1位(最高位),则应该是较长的整数在前面(否则,就是较短的整数在前面),若还是相等,则应比较第n+2位(若不存在n+2位,则回到第1位,如121与12)和第2位,同理若第n+2位大于第2位,则应该是较长的整数在前面(否则,就是较短的整数在前面),如此一直循环下去比较。。。(若均循环一遍仍相同,说明谁先谁后得到的数都一样) 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0。 然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程: Start:25 7 Stan:11 7 Ollie:4 7 Stan:4 3 Ollie:1 3 Stan:1 0 Stan赢得了游戏的胜利。 现在,假设他们完美地操作,谁会取得胜利呢? 郑立、王艳欣:貌似使用辗转相除法,我看了一下,就是辗转相除法一共走了几步,如果是奇数步骤然后就判断stan win 否则就是 ollie win 了。网上说是判断A/B2,这个 我自己算了下,有的对有的不对。 想法:假设a=b, 如果出现a==b接下来下的那一方必win,若出现b==0的情况,则接下来下的那一方必lose; 如果出现a/b=2的情况,则接下来下的那一方必win(因为可以根据实际情况选择a%b或者a%b+b) 否则数将变成b,a-b,递归调用,进行下一步的判断。 ==========我的做法======== #include stdio.h int v=1; void judge(int m,int n) { int t; if (((m/n=2)||(m==n))(v%2==1)) printf(1 win!); else if (((m/n=2)||(m==n))(v%2==0)) printf(2 win!); else {t=m

文档评论(0)

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

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

1亿VIP精品文档

相关文档