给定一个正整数 m 和一个非负整数 s。请你找到长度为 m且各位数字之和为 s 的最小和最大非负整数。
要求所求非负整数不得包含前导零。
输入格式
共一行,两个整数 m,s。
输出格式
在一行内输出满足条件的最小和最大非负整数。
如果无解,则输出 -1 -1。
数据范围前 6 个测试点满足 1≤m≤3。
所有测试点满足 1≤m≤100,0≤s≤900。
输入样例1:
2 15
输出样例1:
69 96
输入样例2:
3 0
输出样例2:
-1 -1
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int Min[N]; int Max[N]={0};
int main()
{
int m; int s;
cin>>m>>s;
int s2=s;
bool success=false;
if(s>9*m)
{
puts("-1 -1"); return 0;
}
if(s==0&&m==1)
{
cout<<"0 0"; return 0;
}
int j=1;
while(s>0)
{
int k=m-j;
if(s>9&&k!=0)
{
Min[k]=9;
s-=9;
}
else if(k==0&&s<=9)
{
Min[k]=s;
success=true;
break;
}
else if(k>0)
{
Min[k]=s-1;
s=1;
}
j++;
}
int k=0;
while(s2>0)
{
if(s2>9&&k!=m-1)
{
Max[k]=9;
s2-=9;
}
else if(k==m-1)
{
Max[k]=s2;
success=true;
break;
}
else if(k<m)
{
Max[k]=s2;
s2-=s2;
}
k++;
}
if(!success)
{
puts("-1 -1");
}
else
{
for(int i=0;i<m;i++)
{
cout<<Min[i];
}
cout<<' ';
for(int j=0;j<m;j++)
{
cout<<Max[j];
}
}
return 0;
}