ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า 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