Chuyển đến nội dung chính

Tìm số nhỏ nhất lớn hơn có cùng số chữ số (C++, Java, Python)

Đề Bài: Cho một số n, tìm số nhỏ nhất có cùng tập hợp chữ số với n và lớn hơn n. Nếu n là số lớn nhất có cùng số chữ số, thì in ra “not possible”.

Ví dụ:

Input:  n = "218765"
Output: "251678"

Input:  n = "1234"
Output: "1243"

Input: n = "4321"
Output: "Not Possible"

Input: n = "534976"
Output: "536479"

Trích: Đề Thi HSG Thành Phố HCM 2008 – 2009

Lời Giải:

Sau đây là thuật toán:

  • Nếu tất cả các chữ số được sắp xếp theo thứ tự giảm dần, thì kết quả luôn là “Not possible”. Ví dụ: 4321.
  • Nếu tất cả các chữ số được sắp xếp theo thứ tự tăng dần, thì chúng ta cần hoán đổi hai chữ số cuối cùng. Ví dụ: 1234.
  • Đối với các trường hợp khác, chúng ta cần xử lý số nhỏ nhất bên phải
// C++ program to find the smallest number which greater than a given number 
// and has same set of digits as given number 
#include <iostream> 
#include <cstring> 
#include <algorithm> 
using namespace std; 

// Utility function to swap two digits 
void swap(char *a, char *b) 
{ 
   char temp = *a; 
   *a = *b; 
   *b = temp; 
} 

// Given a number as a char array number[], this function finds the 
// next greater number. It modifies the same array to store the result 
void findNext(char number[], int n) 
{ 
   int i, j; 

   // I) Start from the right most digit and find the first digit that is 
   // smaller than the digit next to it. 
   for (i = n-1; i > 0; i--) 
      if (number[i] > number[i-1]) 
      break; 

   // If no such digit is found, then all digits are in descending order 
   // means there cannot be a greater number with same set of digits 
   if (i==0) 
   { 
      cout << "Next number is not possible"; 
      return; 
   } 

   // II) Find the smallest digit on right side of (i-1)'th digit that is 
   // greater than number[i-1] 
   int x = number[i-1], smallest = i; 
   for (j = i+1; j < n; j++) 
      if (number[j] > x && number[j] < number[smallest]) 
         smallest = j; 

   // III) Swap the above found smallest digit with number[i-1] 
   swap(&number[smallest], &number[i-1]); 

   // IV) Sort the digits after (i-1) in ascending order 
   sort(number + i, number + n); 

   cout << "Next number with same set of digits is " << number; 

   return; 
} 

// Driver program to test above function 
int main() 
{ 
   char digits[] = "534976"; 
   int n = strlen(digits); 
   findNext(digits, n); 
   return 0; 
} 

 

// Java program to find next greater 
// number with same set of digits. 
import java.util.Arrays; 

public class nextGreater 
{ 
   // Utility function to swap two digit 
   static void swap(char ar[], int i, int j) 
   { 
      char temp = ar[i]; 
      ar[i] = ar[j]; 
      ar[j] = temp; 
   } 

   // Given a number as a char array number[], 
   // this function finds the next greater number. 
   // It modifies the same array to store the result 
   static void findNext(char ar[], int n) 
   { 
      int i; 
      
      // I) Start from the right most digit 
      // and find the first digit that is smaller 
      // than the digit next to it. 
      for (i = n - 1; i > 0; i--) 
      { 
         if (ar[i] > ar[i - 1]) { 
            break; 
         } 
      } 
      
      // If no such digit is found, then all 
      // digits are in descending order means 
      // there cannot be a greater number with 
      // same set of digits 
      if (i == 0) 
      { 
         System.out.println("Not possible"); 
      } 
      else
      { 
         int x = ar[i - 1], min = i; 
         
         // II) Find the smallest digit on right 
         // side of (i-1)'th digit that is greater 
         // than number[i-1] 
         for (int j = i + 1; j < n; j++) 
         { 
            if (ar[j] > x && ar[j] < ar[min]) 
            { 
               min = j; 
            } 
         } 

         // III) Swap the above found smallest 
         // digit with number[i-1] 
         swap(ar, i - 1, min); 

         // IV) Sort the digits after (i-1) 
         // in ascending order 
         Arrays.sort(ar, i, n); 
         System.out.print("Next number with same" + 
                           " set of digits is "); 
         for (i = 0; i < n; i++) 
            System.out.print(ar[i]); 
      } 
   } 

   public static void main(String[] args) 
   { 
      char digits[] = { '5','3','4','9','7','6' }; 
      int n = digits.length; 
      findNext(digits, n); 
   } 
} 
# Python program to find the smallest number which 
# is greater than a given no. has same set of 
# digits as given number 

# Given number as int array, this function finds the 
# greatest number and returns the number as integer 
def findNext(number,n): 
   
   # Start from the right most digit and find the first 
   # digit that is smaller than the digit next to it 
   for i in range(n-1,0,-1): 
      if number[i] > number[i-1]: 
         break
         
   # If no such digit found,then all numbers are in 
   # descending order, no greater number is possible 
   if i == 1 and number[i] <= number[i-1]: 
      print ("Next number not possible") 
      return
      
   # Find the smallest digit on the right side of 
   # (i-1)'th digit that is greater than number[i-1] 
   x = number[i-1] 
   smallest = i 
   for j in range(i+1,n): 
      if number[j] > x and number[j] < number[smallest]: 
         smallest = j 
      
   # Swapping the above found smallest digit with (i-1)'th 
   number[smallest],number[i-1] = number[i-1], number[smallest] 
   
   # X is the final number, in integer datatype 
   x = 0
   # Converting list upto i-1 into number 
   for j in range(i): 
      x = x * 10 + number[j] 
   
   # Sort the digits after i-1 in ascending order 
   number = sorted(number[i:]) 
   # converting the remaining sorted digits into number 
   for j in range(n-i): 
      x = x * 10 + number[j] 
   
   print ("Next number with set of digits is",x) 


# Driver Program to test above function 
digits = "534976"               

# converting into integer array, 
# number becomes [5,3,4,9,7,6] 
number = list(map(int ,digits)) 
findNext(number, len(digits)) 

# This code is contributed by Harshit Agrawal 

 

 

The post Tìm số nhỏ nhất lớn hơn có cùng số chữ số (C++, Java, Python) first appeared on Techacademy.



Nhận xét

Bài đăng phổ biến từ blog này

Học Lập Trình Ở Bình Dương

Bình Dương là một trong những tỉnh thành phát triển nhanh nhất ở Việt Nam, với sự tăng trưởng đáng kể trong lĩnh vực công nghệ thông tin và truyền thông. Trung tâm công nghệ cao Bình Dương đã thu hút nhiều doanh nghiệp công nghệ hàng đầu đặt trụ sở tại đây, tạo ra nhiều cơ hội việc làm và sự phát triển trong lĩnh vực lập trình. Cùng techacademy đi tìm hiểu ngay những địa chỉ học lập trình ở Bình Dương ngay bài viết bên dưới đây nhé. I. Top 10 Địa Chỉ Uy Tín Học Lập Trình Ở Bình Dương Trong thời buổi công nghệ thông tin phát triển như vũ bão hiện nay, việc các lập trình viên phải liên tục bổ sung kiến thức và kĩ năng là điều bắt buộc. Kiến thức học được từ các trường Đại học chưa đủ để đáp ứng những yêu cầu về lập trình viên của các doanh nghiệp, đòi hỏi các bạn trẻ phải chủ động học hỏi thêm bên ngoài. Techacademy sẽ gợi ý giúp bạn những trung tâm đào tạo lập trình uy tín, chất lượng tại Bình Dương để bạn tham khảo lựa chọn nhé! 1. Trung tâm Techacademy Nếu bạn muốn tìm một trung t...

Mảng Trong PHP

Mảng là một cấu trúc dữ liệu lưu trữ một hoặc nhiều loại giá trị tương tự trong một giá trị duy nhất. Ví dụ: nếu bạn muốn lưu trữ 100 số thì thay vì xác định 100 biến dễ dàng để xác định một mảng có độ dài 100. Tìm hiểu về Mảng (Array) trong PHP được sử dụng để tạo một mảng. Mảng là một trong những nội dung cơ bản rất quan trọng trong khóa học lập trình PHP , vì thế học viên nên nắm bắt thật chắc về mảng. mảng php Trong PHP, có ba loại mảng: Mảng được lập chỉ mục – Mảng có chỉ mục số Mảng kết hợp – Mảng với các phím được đặt tên Mảng đa chiều – Mảng chứa một hoặc nhiều mảng 1. Mảng được lập chỉ mục – Mảng có chỉ mục số Các mảng này có thể lưu trữ số, chuỗi và bất kỳ đối tượng nào nhưng chỉ mục của chúng sẽ được biểu diễn bằng số. Theo chỉ mục mảng mặc định bắt đầu từ số không. Thí dụ Sau đây là ví dụ cho thấy cách tạo và truy cập mảng số. Ở đây chúng ta đã sử dụng hàm array () để tạo mảng. Hàm này được giải thích trong tham chiếu hàm.   /* First method to create arr...

Lập Trình Hướng Đối Tượng Trong C++

C ++ là ngôn ngữ lập trình hướng đội tượng khá phổ biến và thường được giới thiệu cho sinh viên khi bắt đầu học làm quen với phương pháp lập trình hướng đối tượng. Tại sao lập trình hướng đối tượng trong C++ lại được người nhiều lựa chọn ngay từ khi bắt đầu, chúng ta hãy cũng tìm hiểu nhé! I. Hướng đối tượng là gì và tại sao nó quan trọng? Hướng đối tượng (Object-Oriented Programming – OOP) là một mô hình lập trình quan trọng đã thay đổi cách chúng ta tiếp cận việc phát triển phần mềm. Được xây dựng dựa trên khái niệm về đối tượng, hướng đối tượng mang lại sự cấu trúc hóa, linh hoạt và dễ quản lý cho mã nguồn. Dưới đây là giải thích về hướng đối tượng và tầm quan trọng của nó trong lập trình. Hướng Đối Tượng là gì? Hướng đối tượng là một phương pháp lập trình tập trung vào việc tổ chức mã nguồn thành các “đối tượng”, mỗi đối tượng đại diện cho một thực thể trong thế giới thực hoặc trong bài toán cụ thể. Mỗi đối tượng bao gồm dữ liệu (thuộc tính) và các phương thức (hành vi) để thao...