学习c语言的第二十九天

约瑟夫环问题:一个圈共有N个人,第一个人的编号为1,现在提供一个数字x,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到x这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到x的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?

先复习一下之前有学习过的约瑟夫环的问题,过了这么多天感觉印象有些模糊了,再重新自己再写一遍加深记忆。

1.数组方式

输入:共有N个人 ,报到x这个数字的人出局。

输出:按出局顺序输出出局的人的编号。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<string.h>
int main(){
   int j, N, x;//共有N人,报到x的人出局;
   printf("输入共有多少人");
   scanf("%d",&N);
   int a[N+1];
   for(j=0;j<=N;j++){//未出局则值为0; 
   	a[j]=0;
   }
   printf("第X人出局");
   scanf("%d",&x);
   int c=0 ,i=0,k=0;//统计已经出局的人
   while(c!=N){
   	    i++;
   	    if(i>N){
   	   	    i=1;//若已经超出人数限制则回到第一个人,即循环作用。 
		}
		if(a[i]==0){
			k++;
			if(k==x){//当k=x时代表当前这个人需要出局,并且k的值需要重新置为0。
				a[i]=1;//表示已出局,值改为1; 
				c++;
				printf("%d ",i);
				k=0;
			}
		} 
   } 
}

2.循环链表方式

输入:共有N个人 ,报到x这个数字的人出局。

输出:按出局顺序输出出局的人的编号。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<string.h>
typedef struct LNode *list;

struct LNode{
	int data;
	list next;
};
 
void y(int n,int x){
    list l=(list)malloc(sizeof(struct LNode));
	list q,r,p=l;
	l->data=1;	
	l->next=NULL;
	int i;
	for(i=2;i<=n;i++){
		list c=(list)malloc(sizeof(struct LNode));
		c->next=NULL;
		c->data=i;
		p->next=c;
		p=c;
	}
	p->next=l;//使链表变为循环链表 
	p=l;
	while(p->next!=p){
		for(i=1;i<x;i++){
			r=p;
			p=p->next;
		}
		printf("%d ",p->data);
		r->next=p->next;
		p=r->next;
	} 
	printf("%d ",p->data);
} 
 
int main(){
   int N,x;
   printf("共有N人");
   scanf("%d",&N);
   printf("第几个人出局");
   scanf("%d",&x);
   y(N,x); 
}

哥德巴赫猜想 

验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。按照格式“n=p+q”输出n的素数分解,其中p≤q,且均为奇素数。要求必须输出所有解。

输入:不小于6的偶数N。

输出:要求输出按照格式“n=p+q”输出n的素数分解,其中p≤q,且均为奇素数。

优化目标:可能没有优化目标。

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
bool su(int n){
	int i,j;
	if(n%2==0){
		return false;
	}
	for(i=2;i<n;i++){
		if(n%i==0){
			return false;
		}
	}
	return true;
}
int main(){
  int n;
  printf("请输入一个不小于6的偶数");
  scanf("%d",&n);
  if(n<6||n%2!=0){
  	printf("输入格式错误");
  }
  int i,j,k;
  for(i=2;i<n/2;i++){
  	j=i;
  	k=n-i;
  	if(su(j)){
  		if(su(k)){
  			printf("%d=%d+%d",n,i,k);
  		    printf("\n");
		  }
	  }
  } 
}

 输出数据中所有奇数的和

输入:长度为l的一组数据。

输出:若长度l不为正数,则输出“输入错误”,若长度l为正数,则输出其中所有奇数的和。

优化目标:可能没有优化目标

#include<stdio.h>
#include<string.h>
#include<stdbool.h>
int main(){
	int l;
	printf("要输入的数据个数"); 
	scanf("%d",&l);
	if(l<=0){
		printf("输入错误"); 
	}
	int a[l];
	int num;
	int i=0;
	while(i<l){
		printf("请输入a[%d]的值",i);
		scanf("%d",&num);
		a[i]=num;
		i++;
	}
	int j,k,sum=0;
	for(j=0;j<l;j++){
		if(a[j]%2!=0){
			sum=sum+a[j];
		}
	}
	printf("sum=%d",sum);
} 

今天复习了一部分c语言的内容,温故而知新,明天也要努力呀!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值