求输入字符串所不能表示的最小正整数

问题:输入一个由若干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;
}

测试结果:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值