argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: C++ проблем  (Прочетена 1290 пъти)

pennev

  • Неактивен Неактивен
  • Публикации: 43
C++ проблем
« -: 08.04.2010, 22:50:11 »

Здравейте! Тази година ще кандидатствам във ФМИ с изпит по информатика, и се готвя със C++. Решавам следната задача:
„Да се състави програма която изчислява всички възможни комбинации на 3 цифри от 1 до 10”. Всичко ясно, 3 вложени цикъла, смятат си там, извеждат на екрана... ОБАЧЕ!
Когато си пусна програмата не започва от 111, а от 812!!! Ще съм много благодарен, ако някой ме просветли защо програмата работи с цифрите от 1 до 6, а от 7 нагоре се сбърква. Ето ми и кода:
#include <iostream.h>
void input(int z)
{
 for(int a=1; a<=z; a++)
    for(int b=1; b<=z; b++)
       for(int c=1; c<=z; c++)
          cout<<a<<" "<<b<<" "<<c<<endl;      
}
void main()
{
   int z;
   cout<<"z= "; cin>>z;
   input(z);
}
(MS Visual C++)
Активен
"Ама и вие едни въпроси задавате..." - казала базата данни и увиснала.

antoniy

  • Управител
  • *
  • Неактивен Неактивен
  • Публикации: 723
    • http://antoniy.net/
Re:C++ проблем
« Отговор #1 -: 08.04.2010, 22:57:05 »

Подозирам, че конзолния ти буфер ти показва само последните 300 реда.
« Последна редакция: 08.04.2010, 23:19:37 от antoniy »
Активен
Too short signature limits.

pennev

  • Неактивен Неактивен
  • Публикации: 43
Re:C++ проблем
« Отговор #2 -: 08.04.2010, 23:22:18 »

Благодаря за бързия отговор. Показва 299 реда. А можеш ли да ми кажеш как да извежда всички редове, или поне повече. Гледах в Options-а на CMD, Buffer Size, но май не е това :)
Активен
"Ама и вие едни въпроси задавате..." - казала базата данни и увиснала.

Светослав Енков

  • Неактивен Неактивен
  • Публикации: 1864
    • Shark's Home Page
Re:C++ проблем
« Отговор #3 -: 09.04.2010, 11:05:52 »

Направи брояч и на 200-300 спирай извеждането...

Жокер - може да гледаш за остатъка от деление на 200 примерно, if ( i % 200 == 0 ) и тук чакане на натискане на клавиш.

Друга идея - просто не извеждай с endl, сложи запетайка и интервал.
  cout<<a<<" "<<b<<" "<<c<<", ";     

Друга тема - не е винаги удачно всички вариации/пермутации/комбинации да се получават с вложени цикли. Ако броят се променя? Ако е висок? Помисли, интересно е.
« Последна редакция: 09.04.2010, 11:08:11 от Светослав Енков »
Активен

pennev

  • Неактивен Неактивен
  • Публикации: 43
Re:C++ проблем
« Отговор #4 -: 09.04.2010, 21:21:48 »

Благодаря за съветите :) с брояча видях началото, а със запетите видях всичко, не се бях сетил (простите неща са гениални). А относно темата за размисъл, помислих си доста, клавиатурата изяде няколко удара, и стигнах само до идеята за използване на масив.

#include <iostream.h>
const m=100;
typedef mas[m];
void input(mas a, int n)
{
   for(int i=0;i<n;i++)   //generira masiv s n broi elementi
      a[ i ]=1;            //vsichki sas stojnosti 1
}
int redica(mas a,int n, int ch)
{   

      for(int i=0; i<n; i++)   
         cout<<a[ i ]<<" ";   // izvejda 1 1 1;
      cout<<endl;            
      int x=0;            // chislo smenqshto elementite na masiva;
      while(x<n)
      {
         x++;
         while(a[n-x]<ch)
         {
            a[n-x]++;            
            for(int i=0; i<n; i++)
               cout<<a[ i ]<<" ";
            cout<<endl;            
         }         
      }
   return 0;
}

int main()
{
   int n, ch; mas a;
   cout<<"Vavedete broj chisla v masiva: "; cin>>n;
   cout<<"Vavedete krajna cifra: "; cin>>ch;
   input(a,n);
   redica(a,n,ch);
   return 0;
   
}

Почти нищо не стана, затова ще помоля за жокер...
Активен
"Ама и вие едни въпроси задавате..." - казала базата данни и увиснала.

pustinqk

  • Гост
Re:C++ проблем
« Отговор #5 -: 09.04.2010, 23:58:51 »

Като начинаещ, рекох и аз да се пробвам.
Ако имаме 4 числа и 3 позиции, вариациите са 4^3.
С числото 1 започват 4^(3-1). Значи, когато i%4^(3-0-1)==0, a[0] се увеличава.
С числото 1, 1 започват 4^(3-2). Когато i%4^(3-1-1), увеличаваме a[1].
и т.н.

Обобщение за n числа и k позиции, което не знам колко е удачно.
//началните стойности на a[] са единици.
for(int i=1; i<=pow(n,k); i++){
       for(int j=0; j<k; j++){
              cout<<a[j]<<" ";
              a[j]=(a[j]+!(i%(int)pow(n, k-j-1)))%n;
       }
       cout<<",  ";
}

Кофтито е, че n-тото число излиза като 0, ама айде сега. :hihi:
« Последна редакция: 10.04.2010, 00:06:29 от xyz- »
Активен