我究竟做错了什么?循环无限地运行.... P.S.-我是新手

时间:2016-04-28 11:01:38

标签: c algorithm

Q值。给你NN棒,每根棒的长度是一个正整数。在棒上进行切割操作,使得它们全部减小最小棒的长度。

假设我们有六支以下长度: 5 4 4 2 2 8

然后,在一次切割操作中,我们从六根棍子中的每一根切割出长度为2的切口。对于下一次切割操作,留下四根棒(非零长度),其长度如下: 3 2 2 6

重复上述步骤直到没有留下棍棒。

考虑到NN棒的长度,打印每次后续切割操作之前剩余的棒数。

注意:对于每次切割操作,您必须重新计算最小棒的长度(不包括零长度棒)。

输入格式 第一行包含单个整数NN。 下一行包含NN整数:a0,a1,... aN-1由空格分隔,其中ai表示第i个长度。

输出格式 对于每个操作,在单独的行上打印切割的木棒数量。

约束 1≤N≤1000 1≤ai≤100(来源 - 黑客) 我的代码:

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
int main(){
    int n; 
    scanf("%d",&n);
    int a[n];
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    printf("%d\n",n);
    int small;
    int sum;
    sum=0;
    small=a[0];
    int j;
    for(;;)
    {
        int k;
        for(k=1;k<n;k++)
        {
            if(a[k]<small)
                small=a[k];
        }
        for(k=0;k<n;k++)
            a[k]=a[k]-small;
        for(k=0;k<n;k++)
        {
            if(a[k]>0)
                sum=sum+1;      
        }
        if(sum==0)
            break;
        printf("%d\n",sum);
        sum=0;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

你的逻辑基本上有两个错误

首先是你找到最小的数字

if(a[k]<small)
            {
            small=a[k];
        }

这是错误的,因为当[k]为0时会出现一些条件。所以每次循环运行时,总是为零。 参见例如

see example

所以它应该替换为

if(a[k]<small **&& a[k]!=0**)
            {
            small=a[k];
        }

另一个问题是当你计算总和时

if(sum==0)
        break;
    printf("%d\n",sum);
    sum=0;

这里,当出现一些负面因素时会出现一个条件,因此结果可能是0或负数,因此应该用

代替
if(sum==0**||sum<0**)
        break;
    printf("%d\n",sum);
    sum=0;

因此,您的代码处于无限循环

See this image also for better explanation