| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1741 人关注过本帖
标题:[求助] C程序的约瑟夫问题,编译成功,运行不成功
只看楼主 加入收藏
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
以下是引用Ashley在2007-3-16 3:51:46的发言:

PcrazyC的代码,m=1时进入死循环

iwfy的代码,(1)m=1时没有删除结点;(2)for(i=1;i<m;i++) pa=pa->next;这句恐怕多走了一步

搞错没有,我试了好多都没问题.顺便再改一点,算法都没改,只是把输出的数减了1,上面的M是1的时候是从0开始,现在改成M是几就从编号为几的开始,从1开始编号

#include "stdio.h"
#define N 3
#define M 1
main()
{int i,j,t,n,a[100],*p,k=1;
p=a;
printf("Enter n:");
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+1;
t=n-1;
do
{for(i=0;i<n;i++)
{if(*(p+i)==0)
for(j=0;j<n;j++)
if(*(p+j)) (*(p+j))--;
if(!(*(p+i)%N)&&*(p+i))
{ *(p+i)=0;
t--;
printf("%d: %d\n",k++,(i+M)>n?(i+M-n):(i+M));
}
}
for(i=0;i<n;i++)
if(*(p+i)) *(p+i)+=n;
}while(t);
for(i=0;i<n;i++)
if(*(p+i))
printf("the last number is %d\n",(i+M)>n?(i+M-n):(i+M));
}


雁无留踪之意,水无取影之心
2007-03-16 10:38
Ashley
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-3-1
收藏
得分:0 
回复:(PcrazyC)以下是引用Ashley在2007-3-16 3:51:...
我说的M不是你程序里的M,而是题目的M,即你程序里的N

2007-03-16 11:02
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
好像是,谢了,我再修改一下

雁无留踪之意,水无取影之心
2007-03-16 11:13
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
#include "stdio.h"
#define N 3
#define M 1
main()
{int i,j,t,n,a[100],*p,k=1;
p=a;
printf("Enter n:");
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+1;
t=n-1;
do
{for(i=0;i<n;i++)
{if(*(p+i)==0)
for(j=0;j<n;j++)
if(*(p+j)) (*(p+j))--;
if(!(*(p+i)%N)&&*(p+i))
{ *(p+i)=0;
t--;
printf("%d: %d\n",k++,(i+M)>n?(i+M-n):(i+M));
}
if(t==0) break;
}
for(i=0;i<n;i++)
if(*(p+i)) *(p+i)+=n;
}while(t);
for(i=0;i<n;i++)
if(*(p+i))
printf("the last number is %d\n",(i+M)>n?(i+M-n):(i+M));
}


加了一句,不会出现死循环了

雁无留踪之意,水无取影之心
2007-03-16 11:31
Ashley
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-3-1
收藏
得分:0 
或者这样:
int Del_LinkList(LinkList p1) /*删除函数*/
{
Lnode *p2;
int dt;
p2=p1->next;
dt=p1->data;
p1->data=p2->data;
p1->next=p2->next;
free(p2);
return dt;
}

main() /*主函数入口点*/
{ /*50*/
int k,n,m,dt,i;
LinkList H;
Lnode *p;
printf("Please insert n,k,m:");
scanf("%d%d%d",&n,&k,&m);
H=Creat_LinkList(n);
p=Get_LinkList(H,k-1);
if (m==1)
for (i=1;i<=n;i++){
printf("%d",p->data);
p=p->next;
}
else{
for (i=1;p!=p->next;p=p->next,i++){
if (i==m){
i=1;
dt=Del_LinkList(p);
printf("%d",dt);
}
}
printf("%d\n",p->data);
}
getch();
}

其他函数见我第一个回复

2007-03-16 12:06
ppsteve
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-3-16
收藏
得分:0 
Ashley正解
2007-03-16 13:25
mhz1986
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-25
收藏
得分:0 
[CODE][/CODE]//约瑟夫问题
#include"stdio.h"
#define N 100
#define M 3
void main()
{
int i,a[N+1],m,cur_m=1,n=N;
for(i=1;i<=N;i++)
a[i]=i;
printf("移走的项依次为:\n");
while(1)
{
if(n==1) {
printf("\nlast:%d\n",a[1]);
break;}
m=(cur_m+M-1)%n;
m==0?cur_m=n:cur_m=m;
printf("%4d ",a[cur_m]);
if(m==0) cur_m=1;
else for(i=m;i<n;i++)
a[i]=a[i+1];
n--;
}
getchar();
}
2007-03-16 15:29
jianfeng
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2006-11-20
收藏
得分:0 

谢谢大家了,Ashley说得没错,但用的好像还是那个建链表的,我自己调试的时候一到那里就有错了,输出的数字中,两个相邻的总有个9,如:1 9 2 9 3 9 4 9 5 9 6 9.。。。。。读Ashley的程序还真有点绕,哈哈

2007-03-16 23:01
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

以前编过,你参考参考:

一.数组

#define N 8
#define M 3
main()
{
int a[N],i,flag=0,num_flag=0;
for(i=0;i<N;i++)
a[i]=i+1;
printf("\noutput:\n");
i=0;
while(num_flag<N)
{
if(a[i]!=0)
{
flag++;
if(flag%M==0)
{
printf("=>%d",a[i]);
num_flag++;
a[i]=0;
}
}
i++;
if(i==N)i=0;
}
getch();
}

二.环链表

#include<malloc.h>

#define LEN sizeof(struct person)
struct person
{
int num;
struct person *next;
};
struct person *creat(int n)
{
struct person *head,*p1,*p2;
int i;
p1=p2=(struct person *)malloc(LEN);
head=NULL;
for(i=1;i<=n;i++)
{
if(i==1)
{head=p1;head->num=1;}
else
p2->next=p1;
p2=p1;
p1=(struct person *)malloc(LEN);
p1->num=i+1;
}
p2->next=head;
return(head);
}

main()
{
struct person *head,*p,*p2;
int M,N;
int i,j;
i=1;
j=1;
printf("\ninput M=:");
scanf("%d",&M);
printf("input N=:");
scanf("%d",&N);
head=creat(M);
p=head;
printf("\noutput:\n");
while(p&&j<=M)
{
if(N==1)
{j=j+1;
printf("=>%d",p->num);
p=p->next;
}
else
{
p2=p;
p=p->next;
i=i+1;
if(i%N==0)
{
p2->next=p->next;
printf("=>%d",p->num);
p->next=NULL;
free(p);
p=p2->next;
i=i+1;
j=j+1;
}
}
}
getch();
}


新王登基,血流成河!
2007-03-19 12:15
快速回复:[求助] C程序的约瑟夫问题,编译成功,运行不成功
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020273 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved