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;
}
答案 0 :(得分:2)
你的逻辑基本上有两个错误
首先是你找到最小的数字
if(a[k]<small)
{
small=a[k];
}
这是错误的,因为当[k]为0时会出现一些条件。所以每次循环运行时,总是为零。 参见例如
所以它应该替换为
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;
因此,您的代码处于无限循环