Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

помощ за задачи C++

Featured Replies

Ще бъда много благодарен ако някой може да помогне за тези задачи.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 (преглед на промените)

  • Автор

За първата задача имам някакви идеи за решаване чрез изразяване на уравнинията, но имам проблем с реализацията като код, а за останалите 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-вата задача можеш да решиш системата по правилото на Крамер, защото броя на неизвестните е равен на броя на уравненията. А и лесно може да се реализира.

Ето ти линк да видиш самото правило 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 (преглед на промените)

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

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

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

Ами напълно е възможно, не бях сигурен как е по-правилно.
това "с втори цикъл (и двоично търсене)." също не ми е ясно какво е;
пробвах да го напиша с два цикъла, очаквах че ще работи доста по-бавно отколкото 
един цикъл и 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;}

 
 

  • Автор

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

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

Ами детерминантата на основната матрица е равна на 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 -> системата няма решения;

  • Автор

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

Нека 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 (преглед на промените)

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.