链接:https://www.nowcoder.com/questionTerminal/024c3b99edc34b84999c5830f748a841
来源:牛客网
在十进制表示中,任意一个正整数都可以用字符’0’-‘9’表示出来。但是当’0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’,一个‘2’,那么你能表示出11,12,121等等,但是无法表示出10,122,200等数。
现在你手上拥有一些字符,它们都是’0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?
输入描述:
第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符。 1 ≤字符串长度≤ 1000
输出描述:
输出你所无法组成的最小正整数
示例1
输入
55
输出
1
示例2
输入
123456789
输出
10
解题思路:
无法组成的最小正整数用min来表示
例如:
输入:1230145611
输出:min=7;
输入:11234567895000
输出:min=10000;
注意:0不是正整数。
规律:
1.1-9有一个/多个字符未出现(第一种情况)
min=未出现的最小数
2.1-9所有字符都出现(第二种情况)
min=出现最小次数的值+数字0出现的次数+1;
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#pragma warning(disable : 4996)
int cheak(char str[], char *a); //检测输入字符串中0-9输入的个数
int main()
{
char min = 0;
char numble = 0;
char str[100] = {'\0'}; //保存输入数据
char a[10] = {0}; //下标0-9便是字符0-9,a[0]-a[9]的值表示0-9出现的次数
char i = 0;
gets(str); //获取输入字符串
if (-1 == *str) //检测是否输入非空
{
printf("输入错误、\n");
return 0;
}
min = a[1];
numble = 1;
if (0==(cheak(str, &a[0])))//检测数字出现次数,返回使用的函数方案)
{
for (int i = 1; i < 10; i++) //找到数组a中第一个为0的下标并且输出
{
if (0==a[i])
{
printf("最小数是:%d\n",a+i-a);
break;
}
}
}
else //所有字符都出现过所执行的算法
{
for (i=1; i < 10; i++) //找出出现次数最多的字符(数组下标表示相应字符,数组值表示)
{
if (min >a[i] )
{
min = a[i];
numble = i;
}
}
printf("%d",numble); //输出出现次数最少的字符
i = a[0] + 1; //输出0个个数为n+1其中n为0出现次数
for (; i > 0; i--)
printf("%d",0);
}
system("pause");
return 0;
}
int cheak(char str[],char *a) //检测输入字符串中0-9输入的个数 返回是不是全部字符都有
{
int count = 0x00; //0-8位表示数字1-9是否出现,若出现相应位置1
int i = 1;
while ('\0' != *str)
{
switch (*str)
{
case '0': a[0]++; break;
case '1': a[1]++, count |=(i<<0); break;
case '2': a[2]++; count |=(i<<1); break;
case '3': a[3]++; count |=(i<<2); break;
case '4': a[4]++; count |=(i<<3); break;
case '5': a[5]++; count |=(i<<4); break;
case '6': a[6]++; count |=(i<<5); break;
case '7': a[7]++; count|= (i<<6); break;
case '8': a[8]++; count|= (i<<7); break;
case '9': a[9]++; count |=(i<<8); break;
default: break;
}
str++;
}
if ((count & 0x1ff) == 0x1ff)
return 1;//字符全出现出现
else
return 0;//有字符全部出现过
}