输入 15,14运行
#include<stdio.h>
int main (void)
{
int n,i,m,j=0,k,l,p=0,q;
printf("pls input the number of people:\n");
scanf("%d",&n);
l=n;
int a[n],b[n],c[n];
for (i=0;i<n;i++)
{a[i]=i+1;
c[i]=a[i];
}
printf("pls name the number u just come to:\n");
scanf("%d",&m);
while(n!=1){
for (i=0;i<n;i++)
{if ((i+1+(m/n)*n)%m==0)
{b[j]=a[i];
k=i;
q=i;
j++;
printf("i=%d,a[%d]=%d \n",i,i,a[i]);
break;}}
for (i=0;i<n-k-1;i++)
{a[i]=a[q+1];
q++;}
for (;i<n-1;i++)
{a[i]=c[p];
p++;}
p=0;
for (i=0;i<n-1;i++)
c[i]=a[i];
for (i=0;i<n-1;i++)
printf("%d ",c[i]);
printf("\n");
n=n-1;}
for (i=0;i<l-1;i++)
printf(" %d",b[i]);
return 0;
}
程序中这个
for (i=0;i<n-1;i++)
c[i]=a[i];
for (i=0;i<n-1;i++)
printf("%d ",c[i]);
printf("\n");
对应我跑出两个结果,如下面标注,行是对的,为什么有个第二行,我看以后的结果她都按第二行运行了。
【相关推荐】
折半查找法的原理是:对于一个升序数组,将中间的数和输入的数进行比较,若中间的数大,则选择数组的前半部分在进行该操作,若中间的数小,则选择数组的后半部分继续进行比较。
例如一个数组a[1]~a[9],其值分别为:1 3 5 7 9 11 13 15 17
如输入带查找的数为5
首先将5和第(1+9)/2=5个元素进行比较,即9,小于它,则再从
a[1]~a[5]中查找,和第(1+5)/2=3个元素进行比较,即5,相等,则输出该数为数组第3个元素。
若查找完后并未找到,则输出不早表中
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,a[16],m,n,p,N,temp=0;
printf("输入按升序排序的15个数:\n");
for(i=1;i<=15;i++)
scanf("%d",&a[i]);
printf("输入要查询的数:\n");
scanf("%d",&p);
m=1;
n=15;
if(p==a[1])
printf("该数是数组中第1个元素");
else if(p==a[15])
printf("该数是数组中第15个元素");
else{
while(fabs(m-n)!=1){//折半插入进行寻找
N=(m+n)/2;
if(a[N]>p)
n=N;
else if(a[N]<p)
m=N;
else
break;
}
}
if(a[N]==p)//判断该书是否在数组中
printf("该数是数组中第%d个元素",N);
else
printf("不在表中!");
}
引用 皆我百晓生 小程序回复内容作答:
在循环执行语句中,第一个for循环用来更新数组c,将数组a的前n-1个元素赋值给数组c,所以第一行输出的结果是正确的。然后紧接着的第二个for循环用来打印数组c的前n-1个元素,所以第二行输出的结果也是正确的。
问题出在程序的逻辑上,在每次循环结束后都会输出数组c的前n-1个元素,所以会出现多个结果。为了解决这个问题,你可以在循环结束后添加一个判断条件,只有当n等于1时才输出数组c的前n-1个元素,可以在循环结束后加上一个判断条件,只有当n等于1时才输出数组c的前n-1个元素。修改后的代码如下:
#include<stdio.h>
int main (void) {
int n, i, m, j = 0, k, l, p = 0, q;
printf("pls input the number of people:\n");
scanf("%d", &n);
l = n;
int a[n], b[n], c[n];
for (i = 0; i < n; i++) {
a[i] = i + 1;
c[i] = a[i];
}
printf("pls name the number u just come to:\n");
scanf("%d", &m);
while(n != 1) {
for (i = 0; i < n; i++) {
if ((i + 1 + (m / n) * n) % m == 0) {
b[j] = a[i];
k = i;
q = i;
j++;
printf("i=%d,a[%d]=%d \n", i, i,a[i]);
break;
}
}
for (i = 0; i < n - k - 1; i++) {
a[i] = a[q + 1];
q++;
}
for (; i < n - 1; i++) {
a[i] = c[p];
p++;
}
p = 0;
for (i = 0; i < n - 1; i++) {
c[i] = a[i];
}
n = n - 1;
}
if (n == 1) { // 判断条件:只有当n等于1时才输出数组c的前n-1个元素
for (i = 0; i < l - 1; i++) {
printf("%d ", c[i]);
}
printf("\n");
}
for (i = 0; i < l - 1; i++) {
printf(" %d", b[i]);
}
return 0;
}
这样修改后,每次循环结束后只有当n等于1时才会输出数组c的前n-1个元素,避免了出现多个结果。