知识点:循环对10取余,对10取整
题1:制作门牌号。
例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。
请问要制作所有的1到2020号门牌,总共需要多少个字符2?
易错点:取整的时候要注意保持原数不变,用一个temp=doornumber来进行操作
#include <iostream>
using namespace std;
int main()
{
int num[10]={0};
int doornumber,i,total2=0;
for(doornumber=1;doornumber<=2020;doornumber++){
int temp=doornumber; //注意这里用一个相同数来取余取整,保证原数不变
while(temp!=0){
i=temp%10;
num[i]++;
temp=temp/10; //这时temp就变了
}
}
total2=num[2];
cout<<"2的个数为"<<total2;
return 0;
}
题2:拼数字。
例如,当小蓝有30张卡片,其中到9各3张,则小蓝可以拼出1到10.
但是拼 11时卡片1已经只有一张了,不够拼出11。
现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?
易错点:有两个判断,第一个判断是判断这个数字能否拼出来,第二个判断是计数是否终止(即输出最终答案),所以嵌套两个while判断。
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int num[10]={2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
int number=1;
bool can_proceed=true;//用来暂停循环
while(can_proceed){
int temp=number;
bool can_form=true;//用来判断下个数能否产生
while(temp!=0){
int i=temp%10;
if(num[i]>0){
num[i]--;
temp=temp/10;
}else{
can_form=false;
break;
}
}
if(can_form){ //如果能产生,number++
number++;
}else{ //不能产生,结束循环
can_proceed=false;
}
}
cout<<number-1;
return 0;
}
文章讲述了如何使用C++编程解决两个问题:计算从1到2020号门牌所需的字符总数,以及在有限卡片条件下,小蓝能拼出的最大数字。重点在于理解取余和取整操作,以及避免易错点。
1045

被折叠的 条评论
为什么被折叠?



