Перевернуть и сравнить вектор C++

Извините за мой ужасный английский. Я попытался написать код, выполняя эту работу: - Давая число и пытаясь посчитать до 1 как можно скорее, как я покажу вам ниже: Например: дать 423 -> перевернуть все цифры: 324 -> обратный отсчет до 322 -> обратный:223 -> обратный отсчет до 221 -> обратный: 122 -> 120 -> 21 (021) -> 12 -> обратный отсчет до 1. - Мой алгоритм сравнивает первую и последнюю цифру числа, если (первый> последний) я поверну вспять, если нет, я буду вести обратный отсчет до (первый> последний). Это работало хорошо для любого числа как 121, 131, но не для 101. Так что я не понимаю, почему? Это мой код:

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int nb_digit(int a)
{
    return (int)floor(log10(a)) + 1;
}

int * separate(int a,int b)
{
    int i=0;
    static int digit[10];   
    while(b != 0)
    {   
        b--;
        digit[i] = a/(int)pow(10,b);
        a = a-digit[i]*(int)pow(10,b);
        i++;
    }
    return digit;
}



int main()
{
    int a,b,i=0;
    int *digit;
    cout<<"a = ";
    cin>>a;

    b = nb_digit(a);
    cout<<"a has "<<b<<" digit"<<endl;
    digit = separate(a,b);

    for(i=0;i<b;i++)
        cout<<*(digit+i)<<" ";
    cout <<endl;

    std::vector<int> v (digit, digit + b );
/*  reverse(v.begin(),v.end());

    cout<<"reverse digit:"<<endl;
    vector<int>::iterator it;

*/  vector<int>temp;
    vector<int>::iterator it;
    int count=9;

    while(v.size()>1)
    {   
        if( *(v.begin()) > *(v.end()-1) ) {
            temp = v;               
            reverse(v.begin(),v.end()); 
            if(v==temp)         // check reverse not changed
                (*(v.end()-1))--;
            if(*(v.begin())==0)
                v.erase(v.begin());
            cout<<"new number, reverse:"<<endl;
            for ( it= v.begin(); it != v.end(); ++it)
                cout << *it<< ' ' ;     
            cout << endl;
        }
        else if ( *(v.begin()) == *(v.end()-1) ) {
            if ( *(v.begin()+1) > *(v.end()-2) ) {
                temp = v;
                reverse(v.begin(),v.end());
                if(v==temp)         // check reverse not changed
                    (*(v.end()-1))--;
                if(*(v.begin())==0)
                    v.erase(v.begin());
                cout<<"new number, reverse:"<<endl;
                for ( it= v.begin(); it != v.end(); ++it)
                    cout << *it<< ' ' ;     
                cout << endl;
            }
            else {  
                (*(v.end()-1))--;
                cout<<"new number, not reverse:"<<endl;
                for ( it= v.begin(); it != v.end(); ++it)
                    cout << *it<< ' ' ;
                cout << endl;
            }
        }
        else {  
            (*(v.end()-1))--;
            cout<<"new number, not reverse:"<<endl;
            for ( it= v.begin(); it != v.end(); ++it)
                cout << *it<< ' ' ;
            cout << endl;
        }
        count++;
    }

    cout << "count = "<<count<<endl;
    cout << '\n';   
    return 0;
}

Спасибо за объяснение моего ответа!

1 ответ

Может быть больше, но есть ошибка в вашей отдельной функции. Попробуйте что-то вроде этого:

int * separate(int a,int b)
{
    static int digit[10];
    while(b != 0)
    {
        b--;
        digit[b] = a % 10; // processing lowest digit first and 
                           // placing into array backward
        a /= 10;
    }
    return digit;
}
Другие вопросы по тегам