【无标题】2022.07.21 练习

本文探讨了约瑟夫环问题的编程实现,通过C语言实例展示了如何使用循环链表解决此经典问题。同时,介绍了如何使用递归实现十进制转换至其他进制的方法,包括数字存储和字符输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.约瑟夫环问题

#include<stdlib.h>
#include<stdio.h>


typedef int datatype;
typedef struct node
{
	datatype data;
	struct node*next;
}Node;

void ysf(int n,int k) //总共有n个人,报到数字k出圈
{
	//创建循环链表
	Node *head=NULL,*p=NULL,*r=NULL;
	head=(Node*)malloc(sizeof(Node));
	if(head ==NULL)
	{
		printf("创建失败\n");
		return;
	}

	head ->data =1;
	head ->next =NULL;
	p=head;
	//创建循环
	for(int i=2;i<=n;i++)
	{
		r=(Node*)malloc(sizeof(Node));
		r->data =i;
		r->next=NULL;
		p->next =r;
		p=r;
	}
	p->next =head;
	p=head;
	while(p->next!=p)
	{
		for(int i=1;i<k;i++)
		{
			r=p;
			p=p->next; //p为出去的结点
		}
		printf("%d\t",p->data);
		r->next=p->next;
		free(p);
		p=p->next;
	}
	printf("%d\t",p->data);

}


int main(int argc, const char *argv[])
{
	
	ysf(10,3);
	printf("\n");
	return 0;

}

2.十进制转换

 void destroy(seqstack *s)                             
 {                                                     
     if(NULL !=s)                                      
     {                                                 
         free(s);                                      
     }                                                 
     printf("释放成功\n");                             
 }                                                     
                                                       
 int convert(seqstack *s,int n,int m)                  
 {                                                     
     seqstack *s=create();                             
     while(n/m!=0)                                     
     {                                                 
         int a=n%m;                                    
         push(s,a);                                    
         n/=m;                                         
     }                                                 
     push(s,n);                                        
     int b=0;                                          
     printf("进制转换后为:");                          
     while(!empty(s))                                  
     {                                                 
         pop(s,&b);                                    
         if(b>-1&&b<10)                                
         {                                             
             printf("%d",b);                           
         }                                             
         else if(b>=10&&b<=15)                         
         {                                             
             char c=b+55;                              
             printf("%c",c);                           
         }                                             
         else                                          
         {                                             
             printf("机制转换失败");                  
         }                                            
     }                                                
     printf("\n");                                     
 }                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值