Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาจำนวนที่มากที่สุดพร้อมจำนวนหลักและผลรวมของหลักใน C++


ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า N แสดงถึงการนับหลักของตัวเลขและผลรวมที่แสดงถึงผลรวมของตัวเลข งานของเราคือ หาจำนวนที่มากที่สุดด้วยจำนวนหลักที่กำหนดและผลรวมของหลัก .

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input : N = 3, sum = 15
Output : 960

แนวทางการแก้ปัญหา

วิธีง่ายๆ ในการแก้ปัญหาคือการสำรวจตัวเลข N หลักทั้งหมดจากมากไปหาน้อย ค้นหาตัวเลขผลรวมหลักหากเท่ากับผลรวมให้ส่งคืนตัวเลข

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int digitSum(int n){
   int sum = 0; 
   while(n){
      sum += n%10; 
      n = n/10;
   }
   return sum;
}
int findLargestNumWithSum(int N, int sum){
   if (sum == 0){
      if(N == 1)
         return -1;
      else
         return -1;
   }
   if (sum > 9*N){
      return -1;
   }
   int num = 1;
   for(int i = 0; i < N; i++) 
      num *= 10;
   while(1){
      if(digitSum(num) == sum){
         return num;
      }
      num -- ;
      if(num == 0)
         return -1;
   }
}
int main(){
   int sum = 25, N = 3;
   cout<<"The largest "<<N<<" digit number with sum "<<sum<<" is "<< findLargestNumWithSum(N, sum);
   return 0;
}

ผลลัพธ์

The largest 3 digit number with sum 25 is 997

อีกวิธีในการแก้ปัญหาคือการใช้ Greedy Approach เราจะทำสิ่งนี้โดยเริ่มจาก MSB โดยใส่จำนวนสูงสุดที่เป็นไปได้จากผลรวมแล้วลบออกจากผลรวม

เราจะทำตามขั้นตอนนี้เป็นเวลา N ครั้ง เราจะได้จำนวนที่ต้องการ ดังนั้น หากผลรวมมากกว่า 9 ให้วาง 9 ลงในหลักปัจจุบัน หากน้อยกว่า 9 ให้ใส่ผลรวมลงในหลักปัจจุบัน ทำตามขั้นตอนนี้สำหรับตัวเลขทั้งหมดจาก MSB ถึง LSB ที่วางหลัก

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int findLargestNumWithSum(int N, int sum){
   if (sum == 0){
      if(N == 1)
         return -1;
      else
         return -1;
   }
   if (sum > 9*N){
      return -1;
   }
   int num = 0;
   for (int i = 0; i < N; i++){
      if (sum >= 9){
         num += 9;
         sum -= 9;
         if(i < (N - 1)){
            num *= 10;
         }
      }
      else{
         num += sum;
         sum = 0;
         if( i < (N - 1)) 
             num *= 10;
      }
   }
   return num;
}
int main(){
   int sum = 25,
   N = 3;
   cout<<"The largest "<<N<<" digit number with sum "<<sum<<" is "<<findLargestNumWithSum(N, sum);
   return 0;
}

ผลลัพธ์

The largest 3 digit number with sum 25 is 997