4807. 找数字
给定一个正整数 m� 和一个非负整数 s�。
请你找到长度为 m� 且各位数字之和为 s� 的最小和最大非负整数。
要求所求非负整数不得包含前导零。
输入格式
共一行,两个整数 m,s�,�。
输出格式
在一行内输出满足条件的最小和最大非负整数。
如果无解,则输出 -1 -1
。
数据范围
前 66 个测试点满足 1≤m≤31≤�≤3。
所有测试点满足 1≤m≤1001≤�≤100,0≤s≤9000≤�≤900。
输入样例1:
2 15
输出样例1:
69 96
输入样例2:
3 0
输出样例2:
-1 -1
思路:
最大值(k从数的最高位到最低位)
1)如果s > =9 && k != 最后一位(赋值)
2)如果 s < 9 且不是最后一位 (赋值, s变为0)
3)如果是最后一位(赋值,结束循环)
找最小值(用数组存储)
1)从数的最低位到最高位 数越大越好 从个位开始枚举
(如果s > 9 && k != 第一位)(赋值)
2)如果s <= 9 && k != 第一位 (要留最高位的1,赋值)
3) 如果 s <= 9 && k == 第一位 (赋值,结束循环)
代码:
#include<stdio.h>
int a[50000], b[50000];
int m, s;
int main()
{
scanf("%d%d", &m, &s);
if (s>9*m||s==0)
{
printf("-1 -1\n");
}
else
{
int cnt = 1;
while (s>=10)
{
a[cnt++] = 9;
s -= 9;
}
a[cnt] = s;
if (a[m] != 0)
{
for (int i = m; i > 0; i--)
{
b[m - i+1] = a[i];
}
for (int i = 1; i <= m; i++)
{
printf("%d", b[i]);
}
printf(" ");
}
else
{
int flog = 0;
for (int i = m; i > 0; i--)
{
b[m - i + 1] = a[i];
}
b[1] = 1;
for (int i = 2; i <= m; i++)
{
if (b[i] != 0)
{
b[i] -= 1;
break;
}
}
for (int i = 1; i <= m; i++)
{
printf("%d", b[i]);
}
printf(" ");
}
for (int i = 1; i <= m; i++)
{
printf("%d", a[i]);
}
}
return 0;
}