【练习题】卡片,count()函数,数据类型相同才能运算。

文章讲述了如何通过编程解决小蓝使用2021张0-9数字卡片从1开始拼数的问题,利用计数和枚举的方法找到最大可拼出的正整数,结果为3181。
摘要由CSDN通过智能技术生成

 【题目描述】
小蓝有很多数字卡片,每张卡片上都是数字0 到9。小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从1拼到多少。例如,当小蓝有30 张卡片,其中0到9各3 张,则小蓝可以拼出1 到10,但是拼11 时卡片1 已经只有一张了,不够拼出11。
现在小蓝手里有0 到9 的卡片各2021 张,共20210张,请问小蓝可以从1拼到多少?
提示:建议使用计算机编程解决问题。本题为填空题,只需要算出结果。

【解题】
最初,0到9每个数值的含有量是已知的,也就是每个数值有多少张卡片。现在从1开始枚举数字,每次将数字内的各位数的含有量减去1张,减到0时就得出结论了。那么如何枚举,以及每次枚举时如何取当前整
数的每一位数呢?请读者先自行思考。》枚举过程:从1开始枚举每个整数i,看剩下的数字卡片能不能拼出ì,在拼i时,i每一位上的数字,对应的有量要减1,如果能拼出,则考察下一个整数:如果不能拼出,则结束枚举,此时答案就是i-1。》取每位数:将该整数每次对10取余,取出的就是当前的个位,然后将该整数除以10,继续取个位,如此循环,直到该整数为0。

计数:用数组num,记录0~9数字卡片还剩多少张,num数组各元素初值为2021。
最终答案为3181。

/*
整体思路:
发现规律:‘1’总是被第一个用发完所以最大的数一定是1被最后用完的那个。
一共2021个‘1’,在1没有被用完前不结束循环,让数字一直自增
每自增出一个数字,记录里面的‘1’的个数
所以只要‘1’的个数没超过2021就一直循环,这里用while(bool)最合适当然当n>2021用break跳出因该也行(懒得试验了)
*/
#include<bits\stdc++.h>
using namespace std;
int maxn=1e5+10;
bool YongWan=true;//设为true,当n>2021时被用完
int main(){
	
	string str;
	int n=0;//‘1’的个数
	int a=0;//‘生成的数字’
	char b[maxn];//装载从int型变为char型的数据
	while(YongWan){
		a++;
		sprintf(b,"%d",a);
		str.assign(b);//char变成string以便用count()统计。
		n+=count(str.begin(),str.end(),'1'/*重点:count()函数记录字符串中出现的'1'(char类型)的个数,如果误写成"1"(字符串类型)会导致char 与
		string类型不匹配导致无法运算的问题。*/);
		if(n>2021)	YongWan=false;
		}
	
	cout<<a-1<<endl;//由于while先自增再判断n>2021,所以a-1。
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值