2015-02-11 87 views
1

用户将得到N,分别š错误的输出,但为什么?

如果N的值是3,即我有3盒和S的输入是6 然后我以这样的方式,在第一情况下(N编码= 3),每个方框加1,然后再向每个方框(A,B,C)加1(n = 2),除了最后一个方框外,再次(n = 1)最后一个盒子以及倒数第二个盒子。
而留在每个框中合计值S的分布后,以显示球的总数,

例如:

它看起来像这样,其中a,b,c为3盒。 N = 3和s = 6

A B C 
1 1 1 
1 1 
1 
----- 
3 2 1 //output to be displayed 

再次如果N ANS S上的输入为4和9 然后输出将是,

A B C D 
1 1 1 1 
1 1 1 
1 1 
------- 
3 3 2 1 //output to be displayed 

如果再次正ANS S中的输入3个和4 然后输出将是,

A B C D 
1 1 1 1 
1 
------- 
2 1 1 1 //output to be displayed 

如果再次正ANS S上的输入为4和2 然后输出将是,

A B C D 
1 1 
------- 
1 1 0 0 //output to be displayed 

对于s的N MAX值= N *(N + 1)/ 2

实际上在这种情况下,该代码的复杂性是不能忽视的为O(n^2)。所以这是我的代码:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int n,i,j,s,y,x1; 
    scanf("%d%d",&n,&s); 
    int b[n]; 
    memset(b,0,n); 
    x1=n; 
    j=0; 
     while(s>0) 
     { 
      y=j%n; 
      if(j!=n-1) 
      { 
       b[y]++; 
       s--; 
       j++; 
      } 
      else 
      { 
       b[y]++; 
       s--; 
       j=0; 
       n--; 
      } 
     } 
    for(i=0;i<x1;++i) 
     { 
      printf("%d ",b[i]); 
     } 
return 0; 
} 

但执行代码,通过我的代码给出的输出后:

where n = 4 and s = 9 
the output is : 3 32631 -747449654 32629 

where n = 3 and s = 5 
the output is :2 2 4195586 

这究竟是为什么?我不想使用嵌套for循环! 但是这里有什么不对?请帮帮我!

+1

你知道'memset(b,0,n)'把'b'的第一个'n' *字节*设置为零,但'b'是一个数组'n ''int's? – lurker 2015-02-11 21:56:51

+0

顺便说一句,作为一种改进,我建议总是给你的程序中的变量提供更多的描述性名称,比如“box”而不是“b”和“numBoxes”而不是“n”。它会帮助你和其他看你的代码的人更容易地遵循逻辑。 – 2015-02-11 22:06:00

+0

这段代码的时间复杂度是多少? – 2015-02-11 22:15:21

回答

2

void * memset (void * ptr, int value, size_t num);

num是字节数,所以

memset(b,0,n);

应该是

memset(b,0,n*sizeof(int));

Live Demo

1

memset的第三个参数是要设置的字节的数量。由于bint的数组,因此需要清除4*n个字节(假设为32位整数)。正确的代码是

memset(b, 0, sizeof(b)); 
+0

Thnx, 这是我的错误,对不起:( – 2015-02-11 22:03:49

+0

不用担心,每个人都会犯错:) – user3386109 2015-02-11 22:06:22

+0

这段代码的时间复杂度是多少? – 2015-02-11 22:15:50

相关问题