下面是我编写的,不知是否有错,
#include<conio.h>
main()
{int i,j,k=100,a[101;
for(i=1;i<=100;i++)
a[i]=i;
clrscr();
for(j=1;;j=j+30)
{if(k<=30)
break;
if(j>=k)
j=j-k+1;
for(i=j;i<k;i++)
a[i]=a[i+1];
k=k-1;
}
printf("%4d",a[j]);
}
----------------解决方案--------------------------------------------------------
题目:将自然数1到100按顺时针围成一圈,首先取出1,然后顺时针方向按步长L=30取数(已取出的数不再参加记数),直至所有的数均取完为止,最后一个取出的数是多少?
下面是我编写的,不知是否有错,
#include<conio.h>
main()
{int i,j,k=100,a[101;//a[101]
for(i=1;i<=100;i++)
a[i]=i;
clrscr();
for(j=1;;j=j+30)
{if(k<=30)//这个好象不能完成你所说的条件吧.
break;
if(j>=k)
j=j-k+1;
for(i=j;i<k;i++)
a[i]=a[i+1];
k=k-1;
}
printf("%4d",a[j]);
}
----------------解决方案--------------------------------------------------------
为什么不用循环链表呢?
----------------解决方案--------------------------------------------------------
这个问题用单向循环连表很容易解决!如果用循环可以用下边的程序比较麻烦!
#include <stdio.h>
main()
{
int ch[100];
for(int ii=0; ii<100; ii++){
ch[ii]=ii+1;
printf("%d\t",ch[ii]);
}
printf("\n");
int z=0;
int u=0;
printf("%d\t",ch[z]);
ch[z]=0;
for(;;){
for(int g=0; g<100;g++){
// printf("%d\t",ch[g]);
if(ch[g]!=0)
u++;
}
// printf("\n");
if(u<30)
return 0;
else u=0;
for(int j=0;j<30;){
if(z<100){
if(ch[z] !=0)
j++;
z++;
}
else{
z=0;
}
}
printf("%d\t",ch[z-1]);
// printf("\n");
ch[z-1]=0;
}
}
[此贴子已经被作者于2006-4-14 20:02:03编辑过]
----------------解决方案--------------------------------------------------------
用链表会不会好一点.
----------------解决方案--------------------------------------------------------
这是我得程序,还有点问题,大家看一下:
#include <stdio.h>
#include <stdlib.h>
struct student{
int num;
struct student *last;
struct student *next;
};
main(){
int i,m,n;
struct student *temp,*nums[100];
m=0;
for(i=0;i<100;i++) nums[i]->num=i;
for(i=0;i<100;i++){
nums[i]->last=nums[(99+i)%100];
nums[i]->next=nums[(i+1)%99];
}
temp=nums[0];
for(;;){
if(temp->next==NULL){
printf("the number is: %d",temp->num);
exit(1);
}
if(m%30==0){
n=temp->num;
temp->last->next=temp->next;
free(nums[n]);
}
temp=temp->next;
m++;
}
}
----------------解决方案--------------------------------------------------------