您的位置:首页 > 其它

小小总结一下

2011-04-11 08:29 295 查看
      由于感觉自己的能力很差,都大二了,还什么都不怎么会呢。于是乎~最近重新把c语言的经典100道题翻了出来,做了一下。

     

      结果,真令人心寒。有好多题,看似很简单很简单,可是自己还是一下子写不出来。

 

      看来我是真的需要更多的练习了。

 

      总的来说,做完这些题,自己的收获还是不少的,至少把很多已经遗忘了的小东西都捡了起来。

 

      还需努力,下面进军c++百例。

 

      不过,还是先把这个约瑟夫环的小问题记录一下吧。

   

  题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出

  圈子,问最后留下的是原来第几号的那位。

解这道题有两种方式,可以用单循环链表做,也可以用数组做。

一、单循环链表

      先建立一个单循环链表,并将原始标号存在每个结点里,用n记住,当数到n的时候就删除该结点,最后剩下的,将其编号输出则是它原来在队伍的序号。

#include <iostream>
using namespace std;
struct list
{
int th;
list *next;
};

int main()
{
list *head=NULL,*rear,*prior,*p;
int i;
int m,n;			/*m:一个有多少个人		n:报数报到几出列*/
cin>>m,n;
for(i=0;i<10;i++)
{
if(head==NULL)
{
rear=head=new list;
}
else
{
rear->next=new list;
rear=rear->next;
}
rear->th=i+1;
rear->next=head;
}
prior=rear;			/*用prior记住p的前趋*/
p=head;
while(p!=p->next)
{
n=2;
while(n--)
{
prior=p;
p=p->next;
}
cout<<p->th<<" ";
prior->next=p->next;
delete p;
p=prior->next;
}
cout<<p->th<<endl;

cout<<"最后剩下的人原来的序号是:"<<p->th<<endl;
return 0;
}


二、数组

     从1到m初始化数组,当数到n的时候将改为置0,最后数组中不为0 的元素将其输出,则是它在原来队伍中的序号。

#include <iostream>
using namespace std;
int main()
{
int a[10];
int i,m=10;
int n=3;
for(i=0;i<10;i++)
a[i]=i+1;
while(m>1)
{
n=3;
while(1)
{
for(;i<10;i++)
if(a[i]!=0)
{
--n;
if(n==0)
break;
}
if(i>=10)
i=0;
if(n==0)
break;
}
//	cout<<i+1<<" ";
a[i]=0;
--m;
}
for(i=0;i<10;i++)
{
if(a[i]!=0)
cout<<endl<<"最后剩下的人原来的序号是:"<a[i]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  list null 语言 c