c语言编程题帮我看看我哪里出错了

来源:百度知道 编辑:UC知道 时间:2024/05/17 01:34:18
从一个指定的自然数n0开始,按以下公式生成一个数列,直到n(i+1)为1,计算数列的长度(数列中数的个数)

当n(i)是偶数时,n(i+1)=ni/2
当n(i)是奇数时,n(i+1)=3*ni+1
例如:当n0=7时生成的数列为:7,22,11。34,17,52,26,13,40,20,10,5。
16,8,4,2,1.该数列的长度为17。
【编程要求】
1.编写函数int linkrun(int a,int b,int *p),以[a,b]中所有自然数作为n0可以生成b-a+1个满足上述特性的数列,求出这些数列的长度并依次保存到p指向的数组中,函数返回p数组中的最大值。
2.编写main函数,声明变量a、b和一维数组p,接收键盘输入的两个自然数保存到a、b变量中,以a、b和P作为实参调用linkrun函数,将P数组中存储的各数列的长度值和最大值输出到屏幕。
#include<stdio.h>
int linkrun(int a,int b,int *p)
{ int m,n,i,max;
for(n=a;n<=b;n++)
{ m=0;
while(n!=1)
{
if(m%2) n=n/2;
else n=3*n+1;
m++;
}
*p=m;
p++;
}
max=p[0];
for(i=0;i<b-a+1;i++)
{ printf("%d",p[i]);
if(max<p[i]) max=p[i];}
return max;

}
main()
{ int x,y,z,a[100];
printf("please enter x,y");
scanf("%d%d",&x,&y);
z=linkrun(x

改正后如下:
#include<stdio.h>

int linkrun(int a,int b,int *p)
{ int m,n,i,max;
for(i=a;i<=b;i++)
{ m=0;
n=i;
while(n!=1)
{
if(n%2==0) n=n/2;
else n=3*n+1;
m++;
}

p[i-a]=m; //这样写就没问题了
}
/*
for(n=a;n<=b;n++)
{ m=0;
while(n!=1)
{
if(m%2) n=n/2;//题中是对n判断奇偶 不是对数组下标;
else n=3*n+1;
m++;
} //这里如果你里面用n的话 每次循环完后n等于1,便会造成死循环
*p=m;
p++;
}
*/
max=p[0];
for(i=0;i<b-a+1;i++)
{
if(max<p[i]) max=p[i];}
return max;

}
main()
{ int x,y,z,a[100];
printf("please enter x,y\n");
scanf("%d%d",&x,&y);
z=linkrun(x,y,a);
printf("%d",z);

}

while(n!=1) {
if(m%2) n=n/2;//if中m写错了吧 改为n
else n=3*n+1;
m++;<