📄 no_3.cpp
字号:
/*此题的重点不是在程序的实现上,而是在将问题数学化,也就是说在什么情况下
一、k=3*1; 先拿者(猫老大)一定能胜利,我们得用一个数学归纳法来解决这个问题:
(1)如果这儿只1块金子,那么先拿者(猫老大)一定胜利,最小值为1;
(2)当有2块金子,那么先拿者一定(猫老大)胜利,最小值为2;
(3)当有3块金子时,先拿者(猫老大)一定失败!!!
以上面的情况经验证,是正确的,我们以此为基础继续往下推:
二、 k=3*2; (4)如果这儿有4块金子,那么先拿者(猫老大)一定胜利,最小值为1,则就剩下3块,
那么,现在对于3块的先拿者便是最开始的后拿来者。
(5)如果这儿有5块金子,那么先拿者(猫老大)一定胜利,最小值为5,则就剩下3块,
那么,现在对于3块的先拿者(猫老大)便是最开始的后拿来者。
(6) 当有6块金子时,先拿者(猫老大)一定失败!!!
…………………………………………
k=3*n时,同样有上式,
我们设有(a)当有3*n块金子时,先拿者(猫老大)一定失败!!
(b) 当有3*n+1块金子,那么先拿者(猫老大)一定胜利,最小值为1;
(c) 当有3*n+2块金子,那么先拿者(猫老大)一定胜利,最小值为2;
从而得证当输入数再模上3,得到1,2时就是先拿者(猫老大)胜利;0时就是KING
胜利;
*/
#include <stdio.h>
#include <string.h>
#include "stdafx.h"
#define Max 10000
char b[Max];
int a[Max];
void main()
{
int j,len;a[0]=0;
scanf("%s",&b);
while(1){
len=strlen(b);
for(j=0;j<len;j++)
{
a[j]=(int)b[j]-48+a[j];
a[j]=a[j]%3;
a[j+1]=10*a[j];
}
if(a[j-1]==0)
printf("King will win.\n");
else {printf("MaoLaoDa will win.\n%d\n",a[j-1]);}
scanf("%s",&b);a[0]=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -