问题:输入一个由若干0~9组成的字符串,求其不能表示的最小正整数。例如:若输入001123456789,输出应当是22。输入102,输出3。
思路:首先判断输入的字符串中是否含有全部0~9的数字,统计各个数字出现的次数。
1)若存在某些数字(不含零)未出现,则输出未出现数字中的最小值。
2)若0未出现,其余均出现,则输出10。
3)若所有数字均出现,且出现次数最少的数字为X(不含零), 出现的次数为T, 则输出"XXX...XX",其中X的个数为T+1个。
4)若所有数字均出现,且出现次数最少的数字为0,出现的次数为T,则输出10^(T+1)。
以下是程序代码:
#include <iostream>
#include <string>
#include <stack>
#include <fstream>
#include <sstream>
#include <vector>
#include <set>
#include <ctime>//time.h头文件
#include <exception>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
int NoPrintMinNum(string & m_string)
{
map<int, int> m1 ;
vector<int> v1(10, 0);
int minInputNum = 10;
for (int ii=0; ii<m_string.size(); ++ii)
{
if (m_string[ii] >= '0' && m_string[ii] <= '9' )
{
minInputNum = (m_string[ii] -'0')<minInputNum ? (m_string[ii] -'0') : minInputNum;
++m1[m_string[ii] -'0'];
++v1[m_string[ii] -'0'];
}
}
auto iter = m1.begin();
int min_key = 10;
int min_value = m_string.size();
int flag = 0, cnt = 0;
// -----------判断是否所有的数字都有,统计除零以外的最少的数------------
for (; iter!=m1.end(); ++iter)
{
if (iter->second < min_value && iter->first != 0)
{
min_key = iter->first;
min_value = iter->second;
}
if (iter->second != 0)
{
++cnt;
}
}
if (cnt != 10)
flag = 1;
if (!flag && v1[0]>min_value)
{
int result = 0;
for (int ii=0; ii<min_value; ++ii)
result = result + powf(10, ii)*min_key;
return 10*result+min_key;
}
// -------------最小的不为零的数----------------
for (auto ii=0; ii<v1.size(); ++ii)
{
if ( v1[ii] == 0 && ii != 0)
return ii;
}
// ---------10个数字都有,同时最少的是零-------------
if(v1[0] < min_value)
{
int result = 1;
for (int ii=0; ii<=v1[0]; ++ii)
result = 10*result;
return result*1;
}
// ---------别的数字都有,唯独没有零-------------
if (v1[0] == 0)
return 10*minInputNum;
}
int main()
{
string s;
while (1)
{
cout << "请输入字符串: ";
cin >> s;
int minNum = NoPrintMinNum(s);
cout << "Result: " << minNum << endl;
cout << endl;
}
getchar();getchar();
return 0;
}
测试结果: