怎么编写这两个程序(C语言)

学校给高一(三)班分配了一个名额,去参加奥运会的开幕式。每个人都争着要去,可是名额只有一个,怎么办?班长想出了一个办法,让班上的所有同学(共有n个同学)围成一圈,按照顺时针方向进行编号。然后随便选定一个数m,并且从1号同学开始按照顺时针方向依次报数,1, 2, …, m,凡报到m的同学,都要主动退出圈子。然后不停地按顺时针方向逐一让报出m者出圈,最后剩下的那个人就是去参加开幕式的人。
  要求:用环形链表的方法来求解。所谓环形链表,即对于链表尾结点,其next指针又指向了链表的首结点。基本思路是先创建一个环形链表,模拟众同学围成一圈的情形。然后进入循环淘汰环节,模拟从1到m报数,每次让一位同学(结点)退出圈子。
  输入格式:输入只有一行,包括两个整数n和m,其中n和 m的含义如上所述。
  输出格式:输出只有一个整数,即参加开幕式的那个人的编号。
  输入输出样例样例输入8 3样例输出7
问题描述
学校给高一(三)班分配了一个名额,去参加奥运会的开幕式。每个人都争着要去,可是名额只有一个,怎么办?班长想出了一个办法,让班上的所有同学(共有n个同学)围成一圈,按照顺时针方向进行编号。然后随便选定一个数m,并且从1号同学开始按照顺时针方向依次报数,1, 2, …, m,凡报到m的同学,都要主动退出圈子。然后不停地按顺时针方向逐一让报出m者出圈,最后剩下的那个人就是去参加开幕式的人。
要求:用环形链表的方法来求解。所谓环形链表,即对于链表尾结点,其next指针又指向了链表的首结点。基本思路是先创建一个环形链表,模拟众同学围成一圈的情形。然后进入循环淘汰环节,模拟从1到m报数,每次让一位同学(结点)退出圈子。
输入格式:输入只有一行,包括两个整数n和m,其中n和 m的含义如上所述。
输出格式:输出只有一个整数,即参加开幕式的那个人的编号。
输入输出样例
输入样例:
8 3
输出样例:
7
请编写程序的时候不要加什么请输入的一类文字~

第二道题
编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
  (1) 如果该字符是空格,则保留该字符;
  (2) 如果该字符是第一次出现或第三次出现或第六次出现,则保留该字符;
  (3) 否则,删除该字符。
  例如,若用户输入“occurrence”,经过压缩后,字符c的第二次出现被删除,第一和第三次出现仍保留;字符r和e的第二次出现均被删除,因此最后的结果为:“ocurenc”。
  输入格式:输入只有一行,即原始字符串。
  输出格式:输出只有一行,即经过压缩以后的字符串。
  输入输出样例样例输入occurrence样例输出ocurenc
问题描述
编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(1) 如果该字符是空格,则保留该字符;
(2) 如果该字符是第一次出现或第三次出现或第六次出现,则保留该字符;
(3) 否则,删除该字符。
例如,若用户输入“occurrence”,经过压缩后,字符c的第二次出现被删除,第一和第三次出现仍保留;字符r和e的第二次出现均被删除,因此最后的结果为:“ocurenc”。
输入格式:输入只有一行,即原始字符串。
输出格式:输出只有一行,即经过压缩以后的字符串。
输入输出样例
输入样例:
occurrence
输出样例:
ocurenc

第一道题:

#include <stdio.h>
#include <malloc.h>

struct List
{
int i;
struct List *next;
};

void Create(List** pList,int stu)
{
int i;
List *p = NULL;
List *q = p;
for(i=0; i<stu; i++)
{
p = (List*)malloc(sizeof(List));
p->i = i+1;
p->next = NULL;
if(i == 0)
{
*pList = q = p;
}
else
{
q->next = p;
q = q->next;
}
}
q->next = *pList;
}

void Select(List** pList,int num)
{
int i;
List* p = NULL;
p = *pList;
if(*pList == (*pList)->next)
return;
for(i=0; i<num-2; i++)
{
p = p->next;
}
p->next = p->next->next;
*pList = p->next;
Select(pList,num);
}

int main(void)
{
int Student, num;
List *pList = NULL;

scanf("%d %d",&Student,&num);

if(num == 1)
{
printf("%d\n",Student);
return 0;
}

Create(&pList,Student);
Select(&pList,num);
printf("%d\n",pList->i);

return 0;    
}


第二道题:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(void)
{
char buff[1000] = {0};
int i = 0;
int j,k;
int *a;
char *c;
gets(buff);
i = strlen(buff);
c = (char *)malloc(i+1);
a = (int *)malloc(i);

for(j=0; j<i; j++)
a[j] = 1;

for(j=i-1; j>=0; j--)
{
if(buff[j] == ' ')
continue;
for(k=0; k<j; k++)
{
if(buff[j] == buff[k])
a[j]++;
}
}

k = 0;
for(j=0; j<i; j++)
{
if(a[j] == 1 || a[j] == 3 || a[j] == 6)
{
c[k] = buff[j];
k++;
}
}
c[k] = '\0';

printf("%s\n",c);
return 0;    
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-11
第一题:1.做好循环链表 2.输入数据 3.完成功能 4.输出数据
第二题:思路:两个数组,使用循环。
有点烦,懒得写。。。