Помош: Кратки програмки

back_rest

ex mod coder
Член од
19 јули 2006
Мислења
1.590
Поени од реакции
107
Тоа го направив. Тоа не е проблемот. Сега ми го напиша полнењето на купчињата.

Е сега. Ми требаат сите можни позиции на објекти низ тие купчиња. Пример првото е полно прво со 9 објекти а второто со 5. После првото со 8 второто со 5 третото со 1, после 9 4 1, итн. После секое вакво преместување тие ќе се печатат (или ќе се повикува callback функција, тоа не е важно. или едноставно обична фикс функција не треба callback).
И самите објеки не се важни, туку само бројот на објекти во некое купче.
Значи наместо int kupchinja[4][9]; дефинираме само kupchinja[4];
За пример, почетокот нека е kupchinja[0] = 9; kupchinja[1] = 5; kupchinja[2] = 0; kupchinja[3] = 0;

Сега следува рекурзивен алгоритам.
Каква рекурзија не заебавај.

9 5 0 0
8 5 1 0
7 5 1 1
6 5 1 2
5 5 1 3
4 5 1 4
3 5 1 5
2 5 1 6
1 5 1 7
0 5 1 8
0 4 1 9
0 3 2 9
0 2 3 9
0 1 4 9
0 0 5 9

Вака треба?

Еве во C++ на грубо.
Код:
int indFrom, indTo;

while (true) {
   //ind from - prviot element > 0
   for (int i=0; i<n; i++)
     if (pole[i]>0) {
       indFrom = i;
       break;
     }
   
   //ind to posledniot 0 element ili prazno kupce
   for (indTo=i; indTo<n; indTo++)
     if (pole[indTo]==0) break;

   ako e poln, idi nazad.
   while (pole[indTo] < 9) indTo--;

   if (indTo>indFrom){ 
     pole[indFrom]--;
     pole[indTo]++;
   } else {
     break;
   }
   
   for (int i=0; i<n; i++) cout << pole[i] << " ";
   cout << endl;
}
 
Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
Не е така. Има повеќе од само 15ина комбинации.
инаку овај примеров погоре има грешка. вака вади:
9 5 0 0

8 6 0 0
7 7 0 0
6 8 0 0
5 9 0 0
4 10 0 0
3 11 0 0
2 12 0 0
1 13 0 0
0 14 0 0
0 14 0 0
... се повторува 14 бесконечно


Инаку и јас глуп, можев да би кажам вака: Најди ги сите четирцифрени, трицифрени итн. броеви чии збир на цифри е X.

Е сега не сакам да го решам со груба сила (провери ги броеви од 1 до 9999). За олку малку броеви би се решило со груба сила, но што ако задачата бараше да бараш 10 цифрени броеви или поголеми.

Со тоа што викав прво се исполнува првото купче до максумум, па потоа второто итн, всушност го бараме најмалиот број чиј збир на цифри го задоволува условот. (велам најмалиот ако pole[0] се единици а pole[3] илјадарки. ако беше обратно со тоа пополнувањето го најдуваме најголемиот.)

Не мора алгоритам како мојава замисла со преместување, ако има и друг кажете ми го тој. Само да не биди груба сила.
 

back_rest

ex mod coder
Член од
19 јули 2006
Мислења
1.590
Поени од реакции
107
Аха, грешка сум те разбрал.

Тебе ако ти требаат сите меѓусостојби на пренос од почетна до крајна состојба, тогаш таман е почнуваш од оригиналниот број и со bruteforce идеш надолу. Значи штом мораш да ги принташ сите меѓусостојби, Brute force не ти бега. Во тој случај ти немаш решавање на проблем туку имаш симулација.

Генерално се сведува на создавање на дрво или општо во граф. На таков начин можеш рекурзивно да ги прикажеш сите можни текови. Значи, може рекурзивно да изградиш дрво, а потоа да го изминеш во ОЛД и да го добиеш бараниот резултат. Комплексноста не можам да ја утврдам, можно е да е неполиномична (NP).
 

dragansk

хелоу...
Член од
2 февруари 2008
Мислења
271
Поени од реакции
4
За овие погоре. Може да се испрограмира скрипта, јазикот е JScript и работи преку Windows Script Host. Msg plus изложува свој API и така работи тоа. Треба да се прочита документацијата за апи то и тоа е тоа. Немам windows live mesenger (и не мислам да имам - Miranda IM со додатоците FTW) па неможам да тестирам ништо па толку од мене за тоа.

Сега ако може некој мене да ми помогне. Една задача е.

Ја сведов до ова. Имаш неколку купчиња. Во мојов слушај го знаеме бројот на елементи во купчето, но тоа не менува ништо, решението би било слично ако не интересираа самите елементи.
Затоа што не интересира само бројот, имам неколку цели броеви наместо неколку низи (arrays).
Вкупниот број ни е познат од почетокот. Сите купчиња имаат одреден капацитет, во случајов 9.
Тие се празни. Ги полниме така што прво го полниме првото цело, потоа второто цело, и пример, трето колку што останало. Четвртото останува празно. (во задачава имаме 4 купчиња). Доколку не интересираа самите елемени ќе користевме податочна структура Stack (array, покажувач кон последен елемент и push(int) и int pop() методи)

Чим сме ги пополниле купчињата, зема еден објект од едно го преместуваме од друго, земаме друг објект од некое, го ставаме во некое. Ако на почетокот првото купче е цело исполенто а второто до половина, на крајот треба последното да биде цело, а претпоследното до половина.

Во случајов наместо да преместуваме, од едниот цел број ќе намалуваме за 1, а во друг ќе додаваме 1.

Според мене, алгоритмот би бил рекрзувен, со сличности со алгоритам за пермутации.
Јазикот не е важен, ц, ц++, псеудо, било што.
Однапред благодарам.
ке може ли некој да го среди ова
http://forum.kajgana.com/showpost.php?p=2806249&postcount=252 Ч)
 

KoNtEjNeR

sapun
Член од
19 декември 2005
Мислења
2.306
Поени од реакции
44
aко може некој да ми напише краток код во ц или ц++ не ми е битно...
од даден број со модуло како да го поделиш на цифри и да го собереш нивниот збир.
1234
1 + 2 + 3 + 4 = 10
и истото од дадена цифра да ги поделиш пак и да ги зачуваш во обратен редослед
1234 = 4321

со мало објаснување ако може
фала многу
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
aко може некој да ми напише краток код во ц или ц++ не ми е битно...
од даден број со модуло како да го поделиш на цифри и да го собереш нивниот збир.
1234
1 + 2 + 3 + 4 = 10
и истото од дадена цифра да ги поделиш пак и да ги зачуваш во обратен редослед
1234 = 4321

со мало објаснување ако може
фала многу

За првата задача...

Објаснувањето е кратко и јасно... делиш со 10 за да ги одвоиш бројките и со mod (%) ја влечеш последната цифра...
Код:
#include <iostream>

using namespace std;

int main()
{
    int br = 0;
    int niza[0];
    int no = 0;
    
    cout << "Vnesete eden cel broj: ";
    cin >> br;
    
    for(int i=0; br>0; i++){
            niza[i] = br%10;
            br/=10;
            no++;
    }
    
    int sum = 0;
    
    for(int i=0; i<no; i++){
            cout << niza[i] << " + ";
            sum+=niza[i];
    }
    
    cout << " = " << sum;
    
    cin.get();
    cin.get();
}
За втората задача...

Код:
#include <iostream>

using namespace std;

int main()
{
    int br = 0;
    
    cout << "Vnesete cel broj: ";
    cin >> br;
    
    for(int i=0; br>0; i++)
    {
            cout << br%10 << " ";
            br/=10;
    }
    
    cin.get();
    cin.get();
}
Едит: Ако у случај не ти е јасно нешто прашај ќе објаснам подетално :)
 
Член од
6 јуни 2009
Мислења
3.094
Поени од реакции
445
aко може некој да ми напише краток код во ц или ц++ не ми е битно...
од даден број со модуло како да го поделиш на цифри и да го собереш нивниот збир.
1234
1 + 2 + 3 + 4 = 10
и истото од дадена цифра да ги поделиш пак и да ги зачуваш во обратен редослед
1234 = 4321

со мало објаснување ако може
фала многу
Код:
int vratiZbirNaCifri(int n)
{
    int zbir = 0;
    while(n != 0)
    {
        zbir += n % 10; // со n % 10 ја земаме последната цифра
        n /= 10; // ја кратиме последната цифра
    }
    return zbir;
}
тој е принципот на разделување. почекај уште една минута да напишам и за број со цифрите обратно

Код:
int brojSoCifriteObratno(int n)
{
    int brojNaCifri = 0;
    int cifri[20];
    int * cifriPtr = cifri;
    int ret = 0;
    while (n!=0)
    {
        cifri[brojNaCifri] = n % 10;
        n /= 10;
        brojNaCifri++;
    }
    while (brojNaCifri--)
    {
        ret += (*cifriPtr) * stepen(10, brojNaCifri);
        cifriPtr++;
    }
    return ret;
}
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
aко може некој да ми напише краток код во ц или ц++ не ми е битно...
од даден број со модуло како да го поделиш на цифри и да го собереш нивниот збир.
1234
1 + 2 + 3 + 4 = 10
За првата задача...

Објаснувањето е кратко и јасно... делиш со 10 за да ги одвоиш бројките и со mod (%) ја влечеш последната цифра...
Код:
#include <iostream>

using namespace std;

int main()
{
    int br = 0;
    int niza[0];
    int no = 0;
    
    cout << "Vnesete eden cel broj: ";
    cin >> br;
    
    for(int i=0; br>0; i++){
            niza[i] = br%10;
            br/=10;
            no++;
    }
    
    int sum = 0;
    
    [B]for(int i=0; i<no; i++){
            cout << niza[i] << " + ";
            sum+=niza[i];
    }[/B]
    
    cout << " = " << sum;
    
    cin.get();
    cin.get();
}
Друже, сеа ми текна па да се поправам за првата задача... овој горниов код е да ги печати обратно броевите и да го испечати нивниот збор, а ако сакаш да ги печати онака како што се внесени ќе треба да го промениш for циклусот.

Горната задача вака работи:

Влез: 54321
Излез: 1 + 2 + 3 + 4 + 5 = ...

А ако сакаш вака:

Влез: 54321
Излез: 5 + 4 + 3 + 2 + 1 = ...

промени го само болдираниот for циклус вака:

Код:
    for(int i=no-1; i>=0; i--){
            cout << niza[i];
            if(niza[i] != 1) { cout << " + "; }
            
            sum+=niza[i];
    }
Едит: Ваквиот код да знаеш дека би работел само на Dev C++, на другите компајлери мислам дека ќе мора да и дефинираш дожина на низата и ќе треба да додадеш уште еден услов празните полиња да не ги печати, ако можеш да се снајдеш арно, ако не пиши и ќе ја наредиме :)
 
R

Reve0ke

Гостин
А зошто рекурзија не користите?
Код:
#include <iostream>
using namespace std;
int razdeli(int n)
{
    if(!(n))return n;
    return n%10+razdeli(n/10);
}
main()
{
      int x;
      cout<<"Vnesi broj:";
      cin>>x;
      cout<<"Zbirot na cifrite e:"<<razdeli(x)<<endl;
      system("pause");
}
При што оваа функцијава ќе врти се додека има цифри и ќе се збира постојано.
 
Член од
11 септември 2008
Мислења
106
Поени од реакции
89
А зошто рекурзија не користите?
Код:
#include <iostream>
using namespace std;
int razdeli(int n)
{
    if(!(n))return n;
    return n%10+razdeli(n/10);
}
main()
{
      int x;
      cout<<"Vnesi broj:";
      cin>>x;
      cout<<"Zbirot na cifrite e:"<<razdeli(x)<<endl;
      system("pause");
}
При што оваа функцијава ќе врти се додека има цифри и ќе се збира постојано.
Da mnogu e pokratok kodot i poubavo izgleda.Ali nema veza vazno e da e tocno nacinot na resavanje ne e tolku biten vo ovoj slucaj,:toe::wink:

Eve uste edna zadaca slicna na ovaa ako nekoj saka da ja resi.
Vnesuvaj neopredelen broj na broevi i ispecati dali zbirot na prvite dve cifri i poslednite dve cifri e ist.

Pr..
6684 == 6+6=12---8+4=12
 
R

Reve0ke

Гостин
А за петоцифрен број како да биди?(пр 55544, т.е не само за петоцифрен туку за број со непарен број цифри)
 

SkyDriver

Would like my bananna ?
Член од
31 јули 2008
Мислења
2.140
Поени од реакции
221
Eve uste edna zadaca slicna na ovaa ako nekoj saka da ja resi.
Vnesuvaj neopredelen broj na broevi i ispecati dali zbirot na prvite dve cifri i poslednite dve cifri e ist.

Pr..
6684 == 6+6=12---8+4=12
Вака ?

Код:
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int Convert(string digit)
{
	int num;
	stringstream ss;
	ss << digit;
	ss >> num;
	return num;
}

int main()
{	
	string theNumber = "";

	cout << "Vnesete eden broj: ";
	cin >> theNumber;

	int sumOfFirstDigit = Convert(theNumber.substr(0, 1)) + Convert(theNumber.substr(1, 1));
	int sumOfLastDigit = (Convert(theNumber) % 10) + (Convert(theNumber)/10) % 10;

	if(sumOfFirstDigit == sumOfLastDigit) { cout << "Zbirot na broevite e ednakov.\n"; }
	else { cout << "Zbirot na broevite ne e ednakov.\n"; }

	cin.get();
	cin.get();
}
 
H

HITCH

Гостин
Помош

Ми треба програм само за снимање на аудио звук. Можеби имало многу вакви теми ама не можам да ги најдам! ФАЛА!
 
Член од
23 јуни 2008
Мислења
9.265
Поени од реакции
5.045
Код:
 <html>
    <head>
        <title>&lt;/title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <script type="text/javascript"> 
 <src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2">&lt;/script>
        <script type="text/javascript">
             var map = null;
             function GetMap()
                  { map = new VEMap('myMap');
                     map.LoadMap();                }
       </script>
   </head>
   <body onload="GetMap();">
      <div id='myMap' style="position:relative; width:400px; height:400px;"></div>
  </body>
</html>

Nekoj znae sho mi e greskava ovde ;/ ?

Dek0 напиша:
Код:
 <html>
    <head>
        <title>&lt;/title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <script type="text/javascript"> 
 <src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2">&lt;/script>
        <script type="text/javascript">
             var map = null;
             function GetMap()
                  { map = new VEMap('myMap');
                     map.LoadMap();                }
       </script>
   </head>
   <body onload="GetMap();">
      <div id='myMap' style="position:relative; width:400px; height:400px;"></div>
  </body>
</html>
Nekoj znae sho mi e greskava ovde ;/ ?

Najdov :) :smir:
 
Член од
14 јуни 2008
Мислења
1.369
Поени од реакции
1.075
Вака сеа...
Имам програма што чита 3 броја различни по големина и после ги печати од најмалиот до најголемиот.
Код:
#include <stdio.h>
main()
{
    int a,b,c;
    printf("Vnesi vrednost za a,b i c:\n");
    scanf("%d%d%d",&a,&b,&c);
    if((a<b)&&(a<c)&&(b<c)) printf("%d\t%d\t%d\t",a,b,c);
    if((a<c)&&(a<b)&&(c<b)) printf("%d\t%d\t%d\t",a,c,b);
    if((b<a)&&(b<c)&&(c<a)) printf("%d\t%d\t%d\t",b,c,a);
    if((b<c)&&(b<a)&&(a<c)) printf("%d\t%d\t%d\t",b,a,c);
    if((c<a)&&(c<b)&&(a<b)) printf("%d\t%d\t%d\t",c,a,b);
    return 0;
}
Ако може некој да ми направи поедноставен алгоритам :toe:, зш на пример ако имам иста ваква само на пр. да чита 50 броја и да ги печати од најмал до најголем нема ваљда за сите 50 да ги пробувам сите можни комбинации..:pop:
 

Kajgana Shop

На врв Bottom