2016-05-28 2 views
-3

Как рассчитать частоту счета каждого оператора (т. Е. Количество раз, когда каждый оператор считывается/выполняется) в следующем C-коде.
Частота каждого утверждения должна быть записана в терминах «n».Рассчитать частоту подсчета для каждого оператора в следующем C-коде

for(i=1;i<=n;i++) 
    for(j=1;j<=i;j++) 
      for(k=1;k<=j;k++) 
       x=x+1; 
+2

Да, школьное задание? –

+0

Нет. Я пытался решить какой-то случайный сложный вопрос из сети по программированию на С и нашел это. Я уже знаю ответ для первых двух утверждений (если я прав). n + 1 и n (n + 1)/2 соответственно. @ HiI'mFrogatto – d02d33pak

+0

Совет: '1 + 2 + 3 + ..... + N = (N + 1) * N/2' – 4386427

ответ

2

Смотрите этот путь, на максимуме,

for(i=1;i<=n;i++) // Executes n times 
    for(j=1;j<=i;j++) // Executes i times for every i -> (1 + 2 + 3 + 4....n) 
      for(k=1;k<=j;k++) // Executes j times for every i,j ---> (1+(1+2)+(1+2+3).....(1+2+3...n)) 
       x=x+1; // Executes every time for every i,j,k ---> (1+(1+2)+.....(1+2+3...n) 

So, you can figure out from this that : 

n + n*(n+1)/2 + (n+(n-1)2+(n-2)3.....(1)n)*2 ... = n + n(n+1)/2+ ((n)(n+1)(n+2)/6)*2 .. Это ваш ответ.

+0

Я думаю, вы написали общее количество раз, когда все операторы будут выполняться. Правильно? – d02d33pak

+0

Да. Это то, что ты хотел, верно? –

+0

@DeepakTalan: Я написал это в обоих направлениях. Я написал количество раз, которое будет выполнять каждая инструкция, а также общее количество раз, когда все инструкции будут выполняться в полном коде. –

1
  • Первый цикл цикла выполняет n раз.
  • Второй цикл цикла: 1 + 2 + 3 + ..... + n = n (n + 1)/2
  • Третий цикл цикла: Σ j (j + 1)/2 для j = 1 - n, т. е. 1 + 3 + 6 + 10 + .. + n (n + 1)/2. Это называется треугольной последовательностью, а сумма равна n (n + 1) (n + 2)/6.
+0

Я думаю, это то, что я искал. Спасибо. – d02d33pak

+0

Не должен ли это быть правильным ответом, чем по сравнению с тем, что в настоящее время обозначено как правильный ответ? Я предоставил вам фактическую рассчитанную сумму для всех трех операторов в терминах n, а другой ответ - нет. – Piyg

+0

Omg. Этого не может быть. Я знаю, что вы все жаждете очков репутации, но не начинаете действовать непрофессионально. Сначала он подходит ко мне, объясняя, почему его ответ правильный, теперь вы. Сначала я правильно ответил на ваш ответ, но потом объяснил, как он написал то же самое, поэтому я отметил его, так как он ответил, прежде чем вы это сделали. И теперь я говорю вам, что ваше лучше и должно быть отмечено правильно. – d02d33pak

1

Start, глядя на только

for(i=1;i<=n;i++) 
    for(j=1;j<=i;j++) 
     expression; 

Он будет идти, как:

for(i=1;i<=n;i++) 
    // i=1, 2, ..., n Total = n 
    for(j=1;j<=i;j++) 
     expression; 
     // i=1 -> j=1    Total = 1 
     // i=2 -> j=1, 2   Total = 2 
     // ... 
     // i=n -> j=1, 2, ..., n Total = n 

Так expression исполняется 1 + 2 + ... + п раз, что (n+1)*n/2

Теперь вы можете рассчитать частоту отдельных выражений.

i=1; // 1 
i<=n; // n+1 
i++; // n 
j=1; // n 
j<i; // ((n+2)*(n+1)/2) - 1 (2+3+...+(n+1)) 
j++; // (n+1)*n/2 

Используя тот же метод, который вы можете добавить for(k=1;k<=j;k++) и пересчитывать частоту.