思路&AC代码:
#include<iostream>
#include<string>
#include<algorithm>//为了使用reverse()把字符串反转
using namespace std;
int main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);
int m,s;
string num1,num2;//题目没说num1和num2不可以相等哦
cin>>m>>s;
if(s>9*m || s==0 && m!=1){cout<<"-1 -1\n";return 0;}//如果sum>位数*9,说明就算所有位都是9也不符合题意;不是一位数,那就不可能全是0,所以s不应该为0
else
{
if(s==0){cout<<"0 0\n";return 0;}//针对0的特殊情况
int cnt=0;
num1.clear();//先清空字符串。不然上一个字符串的结果也会再次被输出
while(s>=9){num1=num1+'9';s-=9;cnt++;}//一直加9,直到加不了
if(s){num1=num1+to_string(s);cnt++;}//剩下的不是0就继续加
int tcnt=m-cnt;//总位数减去添加了数字的次数,等于还没有数字的位数
while(tcnt){num1=num1+'0';tcnt--;}//因为数位和已经用完了,剩下的补0
num2=num1;//因为要先输出小的,所以不能在反转字符串过程中把num1破坏了
reverse( num2.begin()/*num2中出现一第一个字符的地址*/,num2.end()/*num2中出现一最后一个字符的地址*/ );//reverse函数(反转起始位置,反转结束位置),别写成reserve()
//为什么反转就行了?因为num1是从最高位开始排9,而num2刚好需要最后一位开始排9
if(num2[0]!='0'){cout<<num2<<' ';}//第一位不等于0
else {num2[0]='1';num2[m-cnt]--;cout<<num2<<' ';}//如果第一位为0,把第一位变成1,后面第一个不为0的索引为m-cnt。因为加了m-cnt个0,故反转后的第(m-cnt-1)+1开始就不是0了
cout<<num1<<'\n';
}
return 0;
}