2.14总结

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值