leetcode上的除数博弈

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输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值