Помогите с С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kazko, 26 Jan 2011.

  1. kazko

    kazko New Member

    Joined:
    23 Jan 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Тут такое дело, только пошёл в олимпийский резерв по информатике, и много чего незнаю по С++, а наш учитель не знал что я не очень в С++,если не выполню то исключать из резерва, сейчас я должен знать С++ и долгую арифметику(если честно название не расслышал, но вроде так), и так вопрос, точнее задачи:

    1) Дано n числ. Надо найти числа меньше 20-ти

    2) Дано n числ. Найти максимальное число и минимальное.

    3) Дано число n(одно число). Найти максимальную и минимальную ЦИФРУ в этом числе.

    Помогите ̶з̶л̶ы̶е̶ ̶о̶ч̶к̶а̶р̶и̶к̶и̶ добрые программисты! Я знаю что эти задачи сущий пустяк для вас. Ах да если ты мой учитель, быстро нажми красный крестик и всё забудь!)))

    P.S Можете рассказать про эту долгую арифметику.
     
  2. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    1.

    Code:
    #include <iostream>
    
    int main() {
    	int n = 0;
    	int *arr = 0;
    
    
    	std::cout << "Enter n->";
    	std::cin >> n;
    
    	n = ( n > 0 ? n : 5 );
    
    	arr = new int[ n ];
    
    	for( int i = 0; i < n; i++ ) {
    		std::cout << "Enter element number " << i << "->";
    		std::cin >> arr[ i ];
    
    		if( arr[ i ] < 20 ) std::cout << "\n" << arr[ i ] << "<20\n";
    	}
    
    	return 0;
    }
    
    2.

    Code:
    #include <iostream>
    
    int main() {
    	int n = 0;
    	int *arr = 0;
    
    
    	std::cout << "Enter n->";
    	std::cin >> n;
    
    	n = ( n > 0 ? n : 5 );
    
    	arr = new int[ n ];
    
    	for( int i = 0; i < n; i++ ) {
    		std::cout << "Enter element number " << i << "->";
    		std::cin >> arr[ i ];
    	}
    
    	int tempVar = 0;
    	for( int i = 0; i < n; i++ )
    		for( int k = i + 1; k < n; k++ ) {
    			if( arr[ i ] > arr[ k ] ) {
    				tempVar = arr[ i ];
    				arr[ i ] = arr[ k ];
    				arr[ k ] = tempVar;
    			}
    		}
    
    	std::cout << "min:" << arr[ 0 ] << "\nmax:" << arr[ n - 1 ];
    
    	return 0;
    }
    
    3.

    Code:
    #include <iostream>
    
    int main() {
    	int n = 0;
    	int *arr = 0;
    	int tempN = 0;
    	int counter = 0;
    
    	std::cout << "Enter n ->";
    	std::cin >> n;
    
    	tempN = n;
    
    	while( tempN != 0 ) {
    		tempN /= 10;
    		counter++;
    	}
    
    	arr = new int[ counter ];
    
    	tempN = n;
    
    	for( int i = 0; i < counter; i++  ) {
    		arr[ i ] = tempN % 10;
    		tempN /= 10;
    	}
    
    	int tempVar = 0;
    	for( int i = 0; i < counter; i++ )
    		for( int k = i + 1; k < counter; k++ ) {
    			if( arr[ i ] > arr[ k ] ) {
    				tempVar = arr[ i ];
    				arr[ i ] = arr[ k ];
    				arr[ k ] = tempVar;
    			}
    		}
    
    	std::cout << "min:" << arr[ 0 ] << "\nmax:" << arr[ counter - 1 ];
    
    
    
    	return 0;
    }
    
    Ну это на оооочень быструю руку. Тяп-ляп так сказать. Но преподу, думаю сгодится.
     
    #2 Ins3t, 26 Jan 2011
    Last edited: 26 Jan 2011
    1 person likes this.
  3. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    2kazko
    Code:
    int main(){
    	int arr[]={4,12,44,15};
    	size_t size = _countof(arr);
    	copy_if(arr,arr+size,ostream_iterator<int>(cout,"\n"),bind2nd(less<int>(),20));
    	int i_min = *min_element(arr,arr+size);
    	int i_max = *max_element(arr,arr+size);
    	int magic = 192837465;
    	char buf[256];
    	int n = sprintf(buf, "%d", magic);
    	char ch_min = *min_element(buf,buf+n);
    	char ch_max = *max_element(buf,buf+n);
    }
    
     
  4. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    во второй задаче делать поиск излишне :)
    Code:
    int min = max = a[0];
    for(int i=1; i<n; i++)
    {
       if(a[i] > max)
       {
           max = a[i];
       }
       else if (a[i] < min)
       {
       min = a[i];
       }
    }
    забегая вперед, возможно тебе понадобится найти еще и два наибольших элемента в массиве
    Code:
    int maxMax = maxMin = a[0];
    for(int i=1; i<n; i++)
    {
       if(a[i] > maxMax)
       {
           maxMin = maxMax;
           maxMax = a[i];
       }
       else if (a[i] > minMin)
       {
           maxMin = a[i];
       }
    }
    но тебе это наврядли поможет ))
     
  5. Chrek625

    Chrek625 Elder - Старейшина

    Joined:
    6 Jun 2006
    Messages:
    143
    Likes Received:
    13
    Reputations:
    -7
    ТС скорее всего длинная арифметика а не долгая если задания олимпиадные.
     
    #5 Chrek625, 27 Jan 2011
    Last edited: 27 Jan 2011
  6. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    По впечатлением того что написал Ins3t. Пропиарю ка я язык Пролог....
    1.
    less([],[]):-!.
    less([X|L],[X|R]):-X<20,!,less(L,R).
    less([X|L],R):-less(L,R).
    2.
    min([X|L],MIN):-min1(L,X,MIN).
    min1([],M,M):-!.
    min1([X|L],C,M):-C<X,!,min1(L,C,M).
    min1([X|L],_,M):-min1(L,X,M).
    3.
    minDigit(X,R):-split(X,X1),min(X1,R).
    split(0,[]):-!.
    split(X,[X1|R]):-X1 is X % 10,X2 is X / 10,split(X2,R).

    P/S/ Искать мин. элемент за квадрат. ЭТО BDSM!!!!
     
    #6 Irdis, 28 Jan 2011
    Last edited: 28 Jan 2011
  7. XimiK69

    XimiK69 Member

    Joined:
    2 Jan 2010
    Messages:
    45
    Likes Received:
    5
    Reputations:
    0
    Irdis, помню нам преподаватель с матфака рассказывал про математическую логику и для объяснения приводил в пример Пролог, но я как это не взял это в усмотрении, а сейчас наткнулся на твой код и вот хотел бы спросить насколько сложен этот язык в отладке и для написания?
     
  8. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    OFFTOP

    Существует множество интерпретаторов пролога. Один из самых это SWI-Prolog. В нём легко можно отлаживаться. При желании среда пролога может рисовать динамические картинки стек трейсов и пр. Мануала по нему достаточно.
    По началу трудно. Но если проникнуться, то это действительно клёвый язык.
    Так как:
    1) Это декларативный язык.
    2) Написав один предикат(функцию) вы реализуете не одну задачу, а множество. Например написав конкатенацию списков (это 2 строчки). append(X,Y,R) мы решаем следующие задачи
    ?-append([1,2],[3,4],R)
    R=[1,2,3,4]
    ?-append([1,2],[3,4],[1,2,3,4])
    True
    ?-append([1,2],X,[1,2,3,4])
    X=[3,4]
    3) Интерпретатор ищет всеми возможными способами результаты решения задачи по описанию результата, которое вы дали.
    ?-append(Y,X,[1,2,3])
    Y=[] X=[1,2,3];
    Y=[1] X=[2,3];
    Y=[1,2] X=[3];
    Y=[1,2,3] X=[];
    и это ещё не все возможности append...


    Причем, когда вы пишете append, вам не надо думать над решением других задач кроме как конкатенации списков.


    -------
    Например задачу поиска минимума(а заодно проверку является ли элемент мин. множества) можно решать так.
    Минимум это такой элемент, что если мы выкинем его из множества, то минимум из множества с выкинутым эл. будет больше или равен минимуму всего множества. Минимум множества из одного эл. это и есть этот элемент.
    min([X],X):-!.
    min(L,MIN):- append(H,[MIN|T],L),append(H,T,L1),min(L1,M), M>=MIN.
    Решили задачу на этапе "А что такое минимум?".
    -----
    Начать советую с
    http://www.mari-el.ru/mmlab/home/prolog/study_l.html
     
    #8 Irdis, 28 Jan 2011
    Last edited: 28 Jan 2011
    1 person likes this.