argon bulletin board
Факултети => Факултет по математика и информатика => Темата е започната от: pennev в 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++)
-
Подозирам, че конзолния ти буфер ти показва само последните 300 реда.
-
Благодаря за бързия отговор. Показва 299 реда. А можеш ли да ми кажеш как да извежда всички редове, или поне повече. Гледах в Options-а на CMD, Buffer Size, но май не е това :)
-
Направи брояч и на 200-300 спирай извеждането...
Жокер - може да гледаш за остатъка от деление на 200 примерно, if ( i % 200 == 0 ) и тук чакане на натискане на клавиш.
Друга идея - просто не извеждай с endl, сложи запетайка и интервал.
cout<<a<<" "<<b<<" "<<c<<", ";
Друга тема - не е винаги удачно всички вариации/пермутации/комбинации да се получават с вложени цикли. Ако броят се променя? Ако е висок? Помисли, интересно е.
-
Благодаря за съветите :) с брояча видях началото, а със запетите видях всичко, не се бях сетил (простите неща са гениални). А относно темата за размисъл, помислих си доста, клавиатурата изяде няколко удара, и стигнах само до идеята за използване на масив.
#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;
}
Почти нищо не стана, затова ще помоля за жокер...
-
Като начинаещ, рекох и аз да се пробвам.
Ако имаме 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: