2015-12-06 1 views
0

я есть рекуррентное соотношениерекуррентное соотношение: найти битовые строки длиной семь содержат два последовательных 0 в C

enter image description here

и состояние инициалов является

a0 = a1 = 0

с этими двумя, я должен найти битовые строки длины 7, содержащие два последовательных 0, которые я уже решаю.

пример:

a2 = a2-1 + a2-2 + 22-2 
= a1 + a0 + 20 
= 0 + 0 + 1 
= 1 

и так далее до a7.

проблема заключается в том, как преобразовать их в c?

им не очень хорошо, но я пробую его вот так.

#include<stdio.h> 
#include <math.h> 

int main() 
{ 
    int a[7]; 
    int total = 0; 
    printf("the initial condition is a0 = a1 = 0\n\n"); 

// a[0] = 0; 
// a[1] = 0; 

    for (int i=2; i<=7; i++) 
    { 
     if(a[0] && a[1]) 
     a[i] = 0; 
     else 
     total = (a[i-1]) + (a[i-2]) + (2 * pow((i-2),i)); 
     printf("a%d = a(%d-1) + a(%d-2) + 2(%d-2)\n",i,i,i,i); 
     printf("a%d = %d\n\n",i,total); 
    } 
} 

выход не то же самое, как я рассчитать PLS помочь :(

+1

Почему инициализация 'а [0] и' а [1] 'закомментирована? И в инструкции 'if', почему вы каждый раз проверяете' a [0] && a [1] '? Разве вы не хотите проверять что-то другое в зависимости от 'i'? –

+0

(2 * pow ((i-2), i))! = 2^(n-2); (2 * pow ((i-2), i)) = 2 * ((i-2)^i); –

+0

Доступ к индексу за пределами границ, достаточный для неопределенного поведения. – ameyCU

ответ

0

В функции Pow(), Pow (х, у) = х^у (который работает на парном и возвращает двойной) Таким образом, C-код в вашем примере делает 2.0 * (((double) i-2.0)^(double) i) ... Более простой подход к 2^(i-2) (в целочисленной математике) заключается в использовании операция сдвига побитовая:

total = a[i-1] + a[i-2] + (1 << i-2); 

(Примечание: Для ANSI C приоритета операторов обратитесь к стажеру et search engine по вашему выбору.)

Если вы намерены сделать функцию способной поддерживать плавающую точку, то функция pow() будет подходящей ... но виды переменных должны будут соответственно меняться ,

Для целочисленной математики вы можете рассмотреть возможность использования длинного или длинного длинного типа, чтобы у вас было меньше шансов на выход из зазора в типе.

0

Сначала расколоте строки, которые инициализировали 2 первых элемента. Затем в петле для обработки нужны только две линии:

a [i] = a [i-1] + a [i-2] + pow (2, i-2); А затем распечатайте я

1
int func (int n) 
{ 
    if (n==0 || n==1) 
     return 0; 
    if (n==2) 
     return 1; 
    return func(n-1) + func(n-2) + pow(2,(n-2)); 
} 

#include<stdio.h> 
#include <math.h> 

int main() 
{ 
    return func(7); 
} 
+0

спасибо! хотя это покажет только последний ответ, который равен a7. что, если я хочу показать ответ от a1 до a7? – Syaa

+0

Вам нужно будет вызвать его для n = 2 ... 7 и сохранить каждый результат за раз в массиве. –