给出m和s
让你输出m位且各位和为s的最小数和最大数
简单贪心搞一搞就好了
最小数先令第一个为1,接着填0,最后以为填s-1,然后从后往前遍历对>9的处理
最大数直接从前往后每次取可以取的最大数
注意m=1的时候需要特判
代码如下:
#include <bits/stdc++.h>
#define MAXN 120
using namespace std;
int a[MAXN], b[MAXN];
int main(void) {
int m, s;
scanf("%d%d", &m, &s);
bool ok = true;
int tmp = s;
memset(a, 0, sizeof(a));
if(m > 1) {
a[0] = 1;
--s;
a[m-1] = s;
for(int i=m-1; i>0; --i) {
while(a[i] > 9) {
--a[i];
++a[i-1];
}
}
} else a[0] = s;
s = tmp;
for(int i=0; i<m; ++i) {
if(s >= 9) {
b[i] = 9;
s -= 9;
} else {
b[i] = s;
s = 0;
}
}
if(m>1 && (a[0]==0 || b[0]==0)) {
ok = false;
}
for(int i=0; i<m; ++i) {
if(a[i]>=0&&a[i]<=9 && b[i]>=0&&b[i]<=9)
continue;
else {
ok = false;
break;
}
}
if(ok) {
for(int i=0; i<m; ++i)
printf("%d", a[i]);
printf(" ");
for(int i=0; i<m; ++i)
printf("%d", b[i]);
puts("");
} else {
puts("-1 -1");
}
return 0;
}