约瑟夫环问题:一个圈共有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语言的内容,温故而知新,明天也要努力呀!