当前位置: 代码迷 >> C语言 >> [求助]c算法问题???
  详细解决方案

[求助]c算法问题???

热度:233   发布时间:2006-04-13 20:26:00.0
[求助]c算法问题???
题目:将自然数1到100按顺时针围成一圈,首先取出1,然后顺时针方向按步长L=30取数(已取出的数不再参加记数),直至所有的数均取完为止,最后一个取出的数是多少?

下面是我编写的,不知是否有错,

#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]);
}
搜索更多相关的解决方案: 算法  

----------------解决方案--------------------------------------------------------
以下是引用li_ang在2006-4-13 20:26:00的发言:
题目:将自然数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++;
}
}


----------------解决方案--------------------------------------------------------
  相关解决方案