leetcode除数博弈
上面很多评论都是找规律,最后得出来的结论很简单,我觉得不好,既然是玩游戏,就不能确定每个人都是选择的最优选项,所以程序里用随机数,来实现两个人als和bb的选择,用最笨的方法,一直循环,找出结果。
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
struct list{
int num;
struct list *next;
};
struct list *zhaoyinshu(int n)
{
struct list *head=NULL;
struct list *new,*old;
for(int i=1;i<n;i++)
{
if(n%i==0)
{
new=(struct list *)malloc(sizeof(struct list));
if(head==NULL)
{
head=new;
}
else
{
old->next=new;
}
new->num=i;
new->next=NULL;
old=new;
}
}
printf("所有因数:\n");
struct list *tmp;
tmp=head;
while(tmp)
{
printf("%d\t",tmp->num);
tmp=tmp->next;
}
printf("\n");
return head;
}
int yinshucount(struct list *tmp)
{
int count=0;
while(tmp)
{
count++;
tmp=tmp->next;
}
printf("总共有%d个因数\n",count);
return count;
}
int alsxuanze(struct list *tmp,int ncount,int oldn,int als)
{
int a;
int newn;
struct list *ttmp;
ttmp=tmp;//保存头节点,用于释放
srand((unsigned)time(NULL));
a=rand()%ncount+1;
if(als%2==0)
{
printf("als选择第%d个\n",a);
}
else
{
printf("bb选择第%d个\n",a);
}
if(a==1)
{
}
else
{
for(int i=0;i<a-1;i++)
{
tmp=tmp->next;
}
}
printf("减去的因数是%d\n",tmp->num);
newn=oldn-tmp->num;
printf("新的N是(%d-%d):%d\n",oldn,tmp->num,newn);
free(ttmp);
return newn;
}
int main()
{
printf("输入初始数字N:");
int n;
int als=0;
int count;
scanf("%d",&n);
struct list *head;
do
{
head=zhaoyinshu(n);
count=yinshucount(head);
n=alsxuanze(head,count,n,als);
als++;
}while(n!=1);
if(als%2==0)
{
printf("als lose(false)\n");
}
else
{
printf("als win(true)\n");
}
return 0;
}
程序会一直显示游戏的进程,最后当N为1时,循环结束,来判断als和bb的输赢。
知识点
1.通过时间来生成随机数种子,保证每次运行结果不一样
#include <time.h>//添加头文件
srand((unsigned)time(NULL));
通过单双来判断下一次是als还是bb,初始值是0,als选择后为1,该bb选择,bb选择完后为2,又该als选择,所以,als%2==0时,表明bb选择完了,该als选择,als没得选,als输。