Премини към съдържанието

Препоръчан отговор


Ще бъда много благодарен ако някой може да помогне за тези задачи.1.Да се напише програма, която по зададени коефициенти на система от 3 линейни уравнения с 3 неизвестни намира решението на системата, ако то е единствено. Вход: три реда, на всеки от които четири дробни числа, разделени с интервал и означаващи коефициентите пред неизвестните x, y и z от лявата страна на равенството и числото от дясната страна на равенството. Изход:- ако системата има единствено решение, три дробни числа, означаващи стойностите на x, y и z- ако системата няма решение, низа No solution- ако системата има повече от едно решение, низа Many solutionsДа не се извежда нов ред.2.Дадено е положително цяло число а. Да се напише програма, която намира всички положителни цели числа k и m такива, че k2 + m2 = a2. Вход: числото a. Изход: няколко реда от двойки числа k и m, отделени интервал, подредени в нарастващ ред по k (първото число). Ако такива числа няма, извежда низа No solution с нов ред накрая.3.Да се напише програма, която преобразува число X записано в k-ична бройна система в число записано в р-ична. (1 < k, p < 17). Вход: три числа отделени с интервал: числото k, числото p и числото X в k-ична бройна система. Изход: числото X в в p-ична бройна система (за цифри над 9 се използват главните латински букви от A до F. Да не се извежда нов ред.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ще бъда много благодарен ако някой може да помогне за тези задачи.

Здравейте, 

 

Приложете разработката, която се направил досега, за да можем да работим с Вашите дефиниции - така ще бъде по - разбираема помощта, с която ще Ви услужим.

Ако имате проблем с имплементацията, може да приложите идеята, с която мислите да подходите за решаването на задачата и ние ще Ви помогнем и упътим как да се реализира като код.

Ако към се чудите как да подходите, то въпроса Ви по-скоро трябва да е в каква насока да тръгнем.

 

Поздрави !

Редактирано от soundtracker (преглед на промените)
  • Харесва ми 4

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

За първата задача имам някакви идеи за решаване чрез изразяване на уравнинията, но имам проблем с реализацията като код, а за останалите 2 задачи нямам представа как биха могли да се решат.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

За първата задача имам някакви идеи за решаване чрез изразяване на уравнинията, но имам проблем с реализацията като код, а за останалите 2 задачи нямам представа как биха могли да се решат.

За втората. Съвсем очевидно е, че (имайки предвид условието): k и m са по-малки от a.

правим един цикъл за k = от 1 до а-1 и проверяваме дали а2 - к2 случайно не е точен квадрат с sqrt или с втори цикъл (и двоично търсене).

За третата. Число се превръща от една бройна система в друга по следния начин: Намираме стойността му в нативната ни бройна система чрез сумиране на стойностите на всяка цифра умножена по базата на числото вдигната на степен порядъка на цифрата.

Пример:  9B3 в 12тична = 9 * 122 + 11 * 121 + 3 * 120 = 1431.

После извличаме цифрите чрез целочислено делене и остатък на базата на втората система.

Пример: 1431 в 12тична:

1431 % 12 =  3; 1431 / 12 = 119  цифра 3

 119 % 12 = 11;  119 / 12 = 9 цифра 11 = B

9 % 12 =  9; 1431 / 12 = 0   цифра 9

Ако си направиш две малки функцийки да ти дават съответствие на знак 0-F към число от 0-16 и обратно много ще ти помогне :).

 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравей,

 

За 1-вата задача можеш да решиш системата по правилото на Крамер, защото броя на неизвестните е равен на броя на уравненията. А и лесно може да се реализира.

Ето ти линк да видиш самото правило http://bg.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B8_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

 

правим един цикъл за k = от 1 до а-1 и проверяваме дали а2 - к2 случайно не е точен квадрат с sqrt или с втори цикъл (и двоично търсене).

 

 

 

Една забележка само:

ако цикъла е до а-1 двойките ще ги извежда по два пъти.

Примерно

а = 25

 k   m

 7  24

15 20

20 15

24  7

 

k си е в нарастващ ред и може би така е правилно, но ако искаме да се избегне подобно

повторение където k и m са само разменени цикъла би трябвало да е до а/√2.

Редактирано от ined (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Една забележка само:ако цикъла е до а-1 двойките ще ги извежда по два пъти.Примерноа = 25 k   m 7  2415 2020 1524  7 k си е в нарастващ ред и може би така е правилно, но ако искаме да се избегне подобноповторение където k и m са само разменени цикъла би трябвало да е до а/√2.

Съгласен. (обаче от условието са означени k и m т.е. са различни и не знаeм по условие дали (3,4) = (4,3)...) Редактирано от flare (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами напълно е възможно, не бях сигурен как е по-правилно.
това "с втори цикъл (и двоично търсене)." също не ми е ясно какво е;
пробвах да го напиша с два цикъла, очаквах че ще работи доста по-бавно отколкото 
един цикъл и sqrt но се оказа, че на практика дори по-бързо се изпълнява:

#include <iostream.h>unsigned long long a, k, m, n, i, a2;int b=0;int main () {     cout << "a = ";     cin >> a;     a2 = a * a;     m = a;     i = a2;     for (k = 1; k<a; k++) {         n = a2 - k * k;         while (i>n) {             m--;              i = m * m;         }         if ( i == n) cout << ++b << ".  " << k << "   " << m << "n";      }      if (b == 0) cout << "No solutionn";     return 0;}

 
 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Относно първата задача. Крамер се изполва, когато системата има единствено решение и детерминантата е различна от нула. В такъв случай как може да се изчисли кога има повече от едно решение или няма решение.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Относно първата задача. Крамер се изполва, когато системата има единствено решение и детерминантата е различна от нула. В такъв случай как може да се изчисли кога има повече от едно решение или няма решение.

Ами детерминантата на основната матрица е равна на 0 :). Задачата не иска да се разграничават тези два случая, и затова vitaly ти е предложил именно този метод.

това "с втори цикъл (и двоично търсене)."

идеята беше, че на втория цикъл е ясно какво търсим и в какви граници и може да се търси и с двоично търсене, а не като пробваме всеки елемент поотделно. (за големи стойности на a ще има смисъл.)

пробвах да го напиша с два цикъла, очаквах че ще работи доста по-бавно отколкото един цикъл и sqrt но се оказа, че на практика дори по-бързо се изпълнява:

Възможно е, но ми се струва странно, освен за много малки стойности на a, или ако не си пуснал оптимизациите на компилатора. Процесорите си смятат нативно корен квадратен.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами детерминантата на основната матрица е равна на 0 :). Задачата не иска да се разграничават тези два случая, и затова vitaly ти е предложил именно този метод.идеята беше, че на втория цикъл е ясно какво търсим и в какви граници и може да се търси и с двоично търсене, а не като пробваме всеки елемент поотделно. (за големи стойности на a ще има смисъл.)Възможно е, но ми се струва странно, освен за много малки стойности на a, или ако не си пуснал оптимизациите на компилатора. Процесорите си смятат нативно корен квадратен.

 

Да, пробвах , когато детерминантата е равна на 0, но тогава ми излизат и двата низа No solution и Many solutions.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Възможно е, но ми се струва странно, освен за много малки стойности на a, или ако не си пуснал оптимизациите на компилатора. Процесорите си смятат нативно корен квадратен.

Няма оптимизации, но мисля че сханах защо се изпълнява по-бързо.

при цикъл с квадратни корени имаш (а-1) пъти изчисляване sqrt() и (а-1) броя проверки дали е цяло- докато при другия метод това го заместваш с (a-1) пъти изчисляване на m-- и m*m и 2*(а-1) пъти проверка дали става, това което е в повече - е че имаш двойно повече сравнения дали m отговаря на условието защото го сравняваш и при цикъла с k и при този с m, но явно броя тактове които са необходими на процесора за изчисляването на квадратен корен са достатъчно в повече от тези при умножението и това компенсира двойния брой на проверките. Освен това реално цикъла по m приключва преди да стигнал до 1 защото, ако k = a-1 то няма смисъл да се проверява за m < sqrt(2a-1) защото като им събереш квадратите ще получаваш < от а2.

 

Примерно при а = 250000000 първата програма се изпълнява при мене за 1'35", а втората за 58" като приключва при m = 70710 или цикъла по m се е изпълнил 2499929290 пъти, а броя проверките заедно с този по k е  4999929289 пъти.

Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да, пробвах , когато детерминантата е равна на 0, но тогава ми излизат и двата низа No solution и Many solutions.

 

За да разграничиш дали системата няма решенение или има много решения трябва да намериш ранга на основната матрица.

Нека n са броя на неизвестните а rank(A) = r, тогава ако :

 

n = r -> системата има само едно решение, по формулите на Крамер това е ясно и ако детерминатата е различна от 0;

n > r -> системата има много решения;

n < r -> системата няма решения;

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

За да разграничиш дали системата няма решенение или има много решения трябва да намериш ранга на основната матрица.

Нека n са броя на неизвестните а rank(A) = r, тогава ако :

 

n = r -> системата има само едно решение, по формулите на Крамер това е ясно и ако детерминатата е различна от 0;

n > r -> системата има много решения;

n < r -> системата няма решения;

 

Да, но по какъв начин може да се определи рангът на матрица 3x4, така че да може да се реализира по лесен начин в код.

Редактирано от stay_12 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да, но по какъв начин може да се определи рангът на матрица 3x4, така че да може да се реализира по лесен начин в код.

Защо матрица 3x4 ???

 

Основната ти матрица се съставя от неизвестните на всяко уравнение. В твоя случей имаш 3 уравнение с 3 неизвестни следователно матрицата ти би трябвало да е 3х3 ... 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Защо матрица 3x4 ???

 

Основната ти матрица се съставя от неизвестните на всяко уравнение. В твоя случей имаш 3 уравнение с 3 неизвестни следователно матрицата ти би трябвало да е 3х3 ... 

 

Да, моя грешка, матрицата е 3х3. Търсих доста в интернет, но все още не мога да се справя с намирането на рангът на тази матрица.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да, моя грешка, матрицата е 3х3. Търсих доста в интернет, но все още не мога да се справя с намирането на рангът на тази матрица.

 Можеш да прочетеш тук, какво е ранг на матрица http://en.wikipedia.org/wiki/Rank_(linear_algebra). А и никой не е казал че има лесен начин за реализирането на алгоритъм за намиране на ранг на матрица в с++. 

 

П.П Ако искаш може да погледнеш кода на Armadillo библиотеката (http://arma.sourceforge.net/). Това в библиотека наpисана на c++, за линейна алгебра.

Редактирано от vitaly (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 Можеш да прочетеш тук, какво е ранг на матрица http://en.wikipedia.org/wiki/Rank_(linear_algebra). А и никой не е казал че има лесен начин за реализирането на алгоритъм за намиране на ранг на матрица в с++. 

 

П.П Ако искаш може да погледнеш кода на Armadillo библиотеката (http://arma.sourceforge.net/). Това в библиотека наpисана на c++, за линейна алгебра.

 

 

Прочетох информацията. Начинът, по който може да се изчисли е чрез Гаус, но не ми е ясен начинът, по който може да се напише в код.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Прочетох информацията. Начинът, по който може да се изчисли е чрез Гаус, но не ми е ясен начинът, по който може да се напише в код.

 

Добре, най общо казано чрез елементарни преобразувания правиш всички елементи под главният диагонал на 0, и след това рангът на матрицата ти е равен на броя на ненулевите елемнти по главният диагонал или на броя на ненулевите редове на матрицата... :)

 

Ето тук е обясенено и алгоритъм и за  LU decompression или т.н Гаусови елиминаци  -> http://en.wikipedia.org/wiki/LU_decomposition

Редактирано от vitaly (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.