为什么一个循环执行语句跑出两个结果?

输入 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");  

对应我跑出两个结果,如下面标注,行是对的,为什么有个第二行,我看以后的结果她都按第二行运行了。

img

【相关推荐】



  • 你可以看下这个问题的回答https://ask.csdn.net/questions/664419
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
  • 您还可以看一下 李炳辰老师的随机开仓,止盈1~2个点,止损1~20个点能实现盈利正期望吗?课程中的 假设你在任意一个时刻下单,会遇到什么?小节, 巩固相关知识点
  • 除此之外, 这篇博客: 有15个数按从小到大的顺序存放在一个数组中。(折半查找)中的 有15个数按从小到大的顺序存放在一个数组中。输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,输出“不在表中”。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    折半查找法的原理是:对于一个升序数组,将中间的数和输入的数进行比较,若中间的数大,则选择数组的前半部分在进行该操作,若中间的数小,则选择数组的后半部分继续进行比较。

    例如一个数组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个元素,避免了出现多个结果。