if(fabs(a)<=le-6)这句以及下面与le-6有关的语句出错,因为你这里数字“1”打成了字母“l”,你可以在前面加上一句
#define
eps
1e-6,然后if(fabs(a)<=le-6)改成if(fabs(a)<=eps)这样好些,余下类似。
约瑟夫问题
递归解法(推荐):
(1)建立具有几个结点的单循环链表,其数据域值为生成结点时的顺序号。
(2)用计数扫描过的结点,当j=m-1时,说明其直接后继结点就是出列结点,先输出其获数据域值,再删除该结点,再从被删结点的下一个结点重新开始计数。如此重复上述步骤,直到仅剩最后一个结点,再将该结点出列。
例如:
#include
typedef struct node {
int data;
struct node *next;}Lnode;
Lnode *create(int n){
int i;
Lnode *h,*p,*r=(Lnode*)malloc(sizeof(Lnode);
r->data=n;h=r;
for(i=n-1;i>0;i--){
p=(Lnode *)malloc(sizeof(Lnode));
p->data=i;
h=p;}
r->next=h;
return h;
}
void jeseph(Lnode *p,int m){
Lnode *q; int j=0;
printf("outqueue order:");
do{
j++;
if (j==m-1){
q=p->next;
p->next=q->next;
printf("%d",q->data);
j=0;free(q);}
while(p->next!=p);
printf(“%d\n",p->data);
free(p);
}
void main()
{Lnode *h ;
int m,n;
printf ("\n input n,m=");
scanf("%d,%d",&n,&m);
h=create(n);
jeseph(h,m);
}
常规解法
#i nclude"stdio.h"
#define N 100
#define M 3
main()
{
int i,a[N+1],m,cur_m=1,n=N;
for(i=1;i<=N;i++)
a[i]=i;
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("%d--> ",a[cur_m]);
if(m==0) cur_m=1;
else for(i=m;i
n--;
}
getchar();
}
去看南开一百题吧,上面有答案
简化的约瑟夫问题
三级配套的上机试题资料上可以找到答案