Перевернуть и сравнить вектор 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;
}