P132SUMJ - SUM2 J - Hoán vị chữ số

Link Sub: http://www.spoj.com/PTIT/problems/P132SUMJ/
Người Gửi: Sai

  • Problem:

Cho trước một số nguyên dương X. Nhiệm vụ của bạn là tìm số nhỏ nhất lớn hơn X, mà có các chữ số giống hệt với X.

Input
Dòng đầu tiên là số nguyên X (1 ≤ X ≤ 999 999).  
Chữ số đầu tiên của X luôn khác 0.
Output
In ra đáp số trên một dòng. Nếu không có đáp số, in ra “0”.
Example:
Input
156
Output:
165

Input
330
Output:
0
Input
27711
Output:
71127
  • Solution:

Bài này thực chất là sinh hoán vị kế tiếp của một số chủ yếu là các bạn xử lí string. Nhập vào một string và sinh hoán vị cấu hình kế tiếp của nó.

  • Code:

C++:

https://ideone.com/vircn1

#include <iostream>
#include <string>
using namespace std;

int main ()
{
    string n;
    cin>>n;
    int len = n.length();
    int vt=-1;
    for (int i=len-1; i>0; i--)
    {
        int nit1=n[i-1]-'0';
        int ni=n[i]-'0';
        if (nit1<ni)
        {
            vt=i-1;
            break;
        }
    }
    if (vt==-1) cout<<"0";
    else
    {
        for (int i=len-1; i>=0; i--)
        {
            int ni=n[i]-'0';
            int nvt=n[vt]-'0';
            if (ni>nvt)
            {
                int tg=ni;
                n[i]=nvt+'0';
                n[vt]=tg+'0';
                break;
            }
        }
        for (int i=vt+1; i<len; i++)
        {
            for (int j=vt+1; j<len-1; j++)
            {
                int nj=n[j]-'0';
                int njc1=n[j+1]-'0';
                if (nj>njc1)
                {
                    int tg=nj;
                    n[j]=njc1+'0';
                    n[j+1]=tg+'0';
                }
            }
        }
        for (int i=0; i<len; i++) cout<<n[i];
    }
    return 0;
}


JAVA:


Share this

Related Posts

Previous
Next Post »