判断一个数组是否是中心对称数组。
这里的,是干扰项,不影响判断。
头和尾比较一下。len-i-2是由len-i-1再-1因为数组最后一个是,所以减了1。
#include<stdio.h>
#include<string.h>
int main(){
char a[100];
int i;
int flag=1;
scanf("%s",a);
int len=strlen(a);
for(i=0;i<len/2;i++){
if(a[i]!=a[len-i-2]){
flag=0;
}
}
if(flag==0){
printf("No");
}
else if(flag==1){
printf("Yes");
}
return 0;
}
第二题
这里我使用了循环链表来解决这个问题。还可以用数组来解决,我也会贴在下面。
首先创建循环链表
struct Node Node;
int n,m;
scanf("%d,%d",&n,&m);
struct Node *head;
struct Node *p;//p
head=malloc(sizeof(struct Node));
head->num=1;
head->next=NULL;
p=head;
struct Node *last=NULL;//r
int i;
for(i=2;i<=n;i++){
last=malloc(sizeof(struct Node));
last->num=i;
last->next=NULL;
p->next=last;
p=last;
}
p->next=head;
然后,进行弹出人的操作,当p->next !=p时就一直执行往后数m个数的操作,同时连标的指针也往后移m次,同时用另一个指针指向前一个链表,当指针移完后则踢出这个人,上一个指针的next指向当前指针的next,再让头指针指向当前指针也就是被踢出的人的下一个人当头指针。
具体代码如下
p=head;
while(p->next!=p){
for(i=1;i<=m;i++){
last=p;
p=p->next;
}
printf("%d,",p->num);
last->next=p->next;
p=p->next;
}
printf("%d",p->num);
接下来时数组解法
#include<stdio.h>
#include<string.h>
struct stack{
int rear;
int front;
int data[100];
}stack;
void Init(struct stack *s){
s->front=s->rear=0;
}
void change(struct stack *s){
int n,m,i,j;
int k=0;
scanf("%d,%d",&n,&m);
for(i=0;i<n;i++){
s->data[i]=i+1;
}
for (i=n; i>0; i--)
{
k=(k+m)%i;
if(i==1){
printf("%d",s->data[k]);
}
else{
printf("%d,",s->data[k]);
}
for (j=k;j<i-1; j++)
{
s->data[j] = s->data[j+1];
}
n=n - 1;
}
}
int main(){
struct stack s;
Init(&s);
change(&s);
return 0;
}