鏈接: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;//有字符全部出現過
}