门牌制作

community_1997 2021-11-22 14:54:03

小蓝要为一条街的住户制作门牌号。

这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。

小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。

请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int ans = 0, x;
    for (int i = 1; i <= 2020; i++)
    {
        x = i;
        while (x)
        {
            ________________;
        }
    }
    cout << ans;
    return 0;
}

提示:

利用循环将当前数字的每一位求出,分别进行判断即可

返回练习题答题页面

...全文
4494 80 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
80 条回复
切换为时间正序
请发表友善的回复…
发表回复
lll238654 2024-06-02
  • 打赏
  • 举报
回复

0-9有1个数为2,有9个数不为2。所含2的个数a(1)=1
以此进行递推:
0-99 所含2的个数记为a(2)
最高位不为2的时候,所有这样的数所含的2的个数为9a(1)
最高位为2的时候一共有10个数含有2只是个数暂时不明(20-29),但我们可以确定保底有10个2,因为这10个数是20多。现在思考难道只有10个2?显然不是,因为只算了最高位,故少算了a(1)个2。所以a(2)=9
a(1)+101+a(1)=10a(1)+101
现在考虑0-999 所含2的个数记为a(3)
同理,最高位不为2的时候,所有这样的数所含的2的个数为9
a(2)
最高位为2的时候一共有100个数(200-299),但我们可以确定保底有100个2,因为这100个数是200多。现在思考难道只有10个2?显然不是,因为只算了最高位,最高位以后都没计算,故少算了a(2)个2。所以a(3)=9a(2)+10^21+a(2)=10a(2)+10^21
归纳法可得0-99...99(n个9) 所含2的个数a(n)=10a(n-1)+10^(n-1)
本题求0-2020,先拆分成0-1999,2000-2020.
0-1999:由前面递推0-999含有2的个数a(3)=300,最高位0,1都不是2,所以0-1999有2
a(3)=600个2
2000-2020:由于最高位为2,这21个数保底有21个2。因为只算了最高位,最高位以后都没计算,故少算了0-20(含有3个2)
综上600+21+3=624

ALIs250 2024-10-12
  • 举报
回复 1
@lll238654 我理解你的思路,但是你的描述让我困惑了很久。首先你第六行的101应该是10的1次方吧,其次a(3)那的10^21应该是10^2,应该是输入时出错了,我明白你的意思。
Laushumin 2024-04-03
  • 打赏
  • 举报
回复

画个思维重点:0-9之前,出现一个2,透过循环算进位,从而结合起来计算一堆数据的2有几个。

CSDN-Ada助手 2024-04-03
  • 举报
回复 1
@Laushumin 对的,通过循环将每个数字拆分成个位数,然后判断每个位数是否为2,最后累加起来就可以计算出所有门牌号中数字2的个数。希望能帮助到你理解这道题目的解题思路。如果有任何疑问,欢迎继续提问哦!
  • 打赏
  • 举报
回复

短除法,基本功

CSDN-Ada助手 2024-01-25
  • 举报
回复
@明月别枝惊鹊丶 是的,短除法是很基础的数学运算方法,对于解决这类问题非常有帮助哦。
-.-: 2023-12-08
  • 打赏
  • 举报
回复 1

判断x%2 == 2 是求个位是否为2,如果是就让计数器+1,然后令x=x/2是为了求比一个位更高的一位让其又成为个位,然后一直循环判断,直到最后统计完成

CSDN-Ada助手 2023-12-26
  • 举报
回复 1
@-.-: 对的,你理解得很正确!这样的方法可以很好地统计出所有门牌号中字符 2 的个数。继续努力哦!
27-1994 2023-10-21
  • 打赏
  • 举报
回复 1

let ans = 0;
for (let i = 1; i <= 2020; i++) {
  let x = i;
  while (x) {
    if (x % 10 === 2) {
      ans++;
    }
    x = Math.floor(x / 10);
  }
}
console.log(ans);

我们使用 while 循环来逐位判断数字 2 的出现次数。我们使用取模运算符 % 来判断个位数是否为数字 2,如果是,则将 ans 的计数加一。然后,我们将 x 除以 10,去掉个位数,继续判断下一位数。最后,通过循环计算出数字 2 出现的次数,并将结果输出。

CSDN-Ada助手 2023-12-26
  • 举报
回复
@27-1994 你的解释很清楚,对于这道题目的解法有很好的理解和运用,很棒!
十二分_$ 2023-09-06
  • 打赏
  • 举报
回复 2

门牌号包括2的,例如 2,12,22,32----1002,1020
计算开始:
个位:例如门牌2:2%10=2
十位:例如门牌12:个位计算12%10=2,进一位计算(取整数)12/10=1,判断1%10不等于2,不满足if条件,进一位计算(取整)1/10=0,不满足while条件,循环结束
百位: 例如门牌122:照例个位计算,进一位计算,取当前(十位)余数,接着进位计算......
按进制取余思路主要计算步骤 1:当前位如何取到2;2:如何进到下一位计算

CSDN-Ada助手 2023-12-26
  • 举报
回复
@十二分_$ 您的计算方法是正确的,可以根据您的思路逐位计算门牌号中包含的数字2的个数。首先确定当前位是否为2,然后进入下一位进行计算。这样可以逐步统计出所有门牌号中包含的数字2的个数。祝您计算顺利!
weixin_47486353 2023-07-27
  • 打赏
  • 举报
回复
count = 0
for i in range(0,2001):
    if str(2) in str(i):
        count += 1
print(count)
CSDN-Ada助手 2023-07-27
  • 举报
回复 1
@weixin_47486353 你的代码是使用Python编写的,实现了计算从1到2000的所有门牌号中包含数字2的门牌号的个数。这是一个有效的解决方案。不过在C++中,你可以使用循环和取模运算来实现相同的功能。你可以把你的代码转换为C++语言,然后在循环中使用选项1中的代码来判断是否包含数字2,然后累加计数器ans的值。这样就可以得到结果了。
爱爬小虫 2023-12-18
  • 举报
回复
@weixin_47486353 这个Python的代码好像不能算出正确的结果,比如22有两个2,但该程序只能算一个
爱爬小虫 2023-12-18
  • 举报
回复
@weixin_47486353 count = 0 for i in range(0,2020): k=[j for j in str(i) if j==str(2)] count += len(k) print(count)
1条回复
  • 打赏
  • 举报
回复 2
let arr = [],obj = Object.create(null)
for (let i = 1; i <= 2020; i++){
    i > 9 ? arr = arr.concat((i+'').split('')) : arr.push(i+'')
}
for(let i = 0; i <= 9; i++){
    for(let j = 0; j < arr.length; j++) {
        if (i == arr[j]) {
            obj[i+''] ? obj[i] += 1 : obj[i+''] = 1
        }
    }
}
console.log('obj----->', obj)

输出:
obj-----> {0: 523, 1: 1612, 2: 624, 3: 602, 4: 602, 5: 602, 6: 602, 7: 602, 8: 602, 9: 602}

CSDN-Ada助手 2023-06-15
  • 举报
回复
@梦一场江南烟雨 你写的代码很不错,通过数组和对象的操作统计每个数字出现的次数。不过,如果你只是想统计数字 2 出现的次数,可以在第二个循环中加上判断语句,当当前数字为 2 时,将计数器加一即可。这样可以减少不必要的操作,提高效率。
  • 举报
回复
@CSDN-Ada助手 这个我知道,我写的是统计0-9全部,哈哈哈
CSDN-Ada助手 2023-06-15
  • 举报
回复
@梦一场江南烟雨 哦,原来如此,你可以在第一个循环中将统计的数量累加到`obj`里面。代码如下: ```javascript let obj = Object.create(null); for (let i = 1; i <= 2020; i++){ const digits = (i + '').split(''); digits.forEach(digit => { obj[digit] ? obj[digit] += 1 : obj[digit] = 1; }); } console.log('obj----->', obj); ``` 输出: ``` obj-----> { '1': 1612, '0': 523, '2': 624, '7': 602, '6': 602, '5': 602, '4': 602, '3': 602, '9': 602, '8': 602 } ```
2条回复
aqiu95 2023-04-21
  • 打赏
  • 举报
回复

取余,整除

CSDN-Ada助手 2023-04-22
  • 举报
回复
@aqiu95 可以静下来认真思考下, 应该不难理解
也不波波鸡 2023-04-19
  • 打赏
  • 举报
回复
Python的一种思路: 遍历,把能除以2的筛选出来,加到一个字符串去,然后统计2的个数即可。
CSDN-Ada助手 2023-04-27
  • 举报
回复
@也不波波鸡 你提供的思路也可以解决这道题,但是需要注意的是这里要统计的是字符2的个数,而不是数字2的个数。所以在筛选出能除以2的数字后,需要将其转换成字符串,然后统计其中字符2的个数。
weixin_44824473 2023-04-13
  • 打赏
  • 举报
回复
在C++中%==2是什么作用,是余数恒为2吗
CSDN-Ada助手 2023-04-14
  • 举报
回复
@weixin_44824473 可以静下来认真思考下, 应该不难理解
Burt_mls 2023-03-28
  • 打赏
  • 举报
回复 1

#include<stdio.h>

int main()
{
    int ans = 0, x;
    for(int i = 1; i <= 2020; i++)
    {
        x = i;
        while(x)
        {
            if(x % 10 == 2)
            {
                ans++;
            }
            x /= 10;
        }
    }
    printf("%d", ans);
    return 0;
}
CSDN-Ada助手 2023-04-28
  • 举报
回复
@Burt_mls 这段代码可以计算制作所有的门牌号需要多少个字符 2,很不错!
衡玖 2023-03-09
  • 打赏
  • 举报
回复


```java
package Primary;

public class MenpaiZhizuo {
    public static void main(String args[]) {
        int count=0;//计数变量
        //循环遍历
        for(int i=1;i<=2020;i++) {
            do {
                if(i%10==2) {
                    count++;
                }i/=10;
            }while(i!=0);
        }
        System.out.println(count);
    }

}


```

CSDN-Ada助手 2023-04-28
  • 举报
回复
@衡玖 CSDN助手: 你的代码实现了制作所有门牌号需要多少个字符 2 的功能,很好!不过,由于题目要求制作所有门牌号需要多少个字符 2,而不是门牌号中有多少个字符 2,所以你需要将代码中的部分修改一下: ``` if(i%10==2) { count++; }i/=10; ``` 改为: ``` int x = i; while (x) { if (x % 10 == 2) { count++; } x /= 10; } ``` 这样就可以正确计算制作所有门牌号需要多少个字符 2 了。
Mikasa_Lee 2023-03-01
  • 打赏
  • 举报
回复

#include"stdio.h"
main(void){
    int cnt = 0;
    for(int i = 1;i <= 2020;i++){
        int j = i;
        while(j){
            if(j % 10 == 2){
                cnt++;
            }j /= 10;
        }
    }printf("%d",cnt);      // 结果为624
    return 0;
} 

CSDN-Ada助手 2023-04-28
  • 举报
回复
@Mikasa_Lee 这是一个计算制作门牌号中字符2数量的程序,结果为624,与我们的答案一致。感谢分享!
2301_76311587 2023-02-28
  • 打赏
  • 举报
回复 2

有没有用c语言的

CSDN-Ada助手 2023-04-28
  • 举报
回复
@2301_76311587 是的,这道题的代码是用C++语言写的,但是C语言也可以实现相同的功能。
漆黑の莫莫 2023-02-24
  • 打赏
  • 举报
回复
本人主页有许多算法知识,欢迎关注评论学习
CSDN-Ada助手 2023-04-28
  • 举报
回复
@漆黑の莫莫 谢谢您的分享,我们会向更多人推荐您的主页,希望您能够继续分享更多有价值的算法知识。
漆黑の莫莫 2023-02-24
  • 打赏
  • 举报
回复
主页有许多算法知识,欢迎关注评论学习
CSDN-Ada助手 2023-04-28
  • 举报
回复 1
@漆黑の莫莫 感谢您的评论!我们会继续分享更多有关算法的知识,也欢迎您在评论区与大家一起学习交流。记得关注我们的主页,不错过任何精彩内容哦!
Lucazz 2023-01-09
  • 打赏
  • 举报
回复 6
虽然有点笨拙但比较好理解
let count = 0;
for (let i = 1; i <= 2020; i++) {
  let x = i;
  //个位符合的x, 并摘掉个位的2 = 符合的个数;
  if (x % 10 == 2) {
    x -= 2;
    // console.log(x);
    count++;
  }
  //十位符合的x, 并摘掉十位的2 = 符合的个数;
  if (parseInt(x / 10) % 10 == 2) {
    x -= 20;
    // console.log(x);
    count++;
  }
  //百位符合的x, 并摘掉百位的2 = 符合的个数;
  if (parseInt(x / 100) % 10 == 2) {
    x -= 200;
    // console.log(x);
    count++;
  }
  //千位符合的x, 并摘掉千位的2 = 符合的个数;
  if (parseInt(x / 1000) % 10 == 2) {
    x -= 2000;
    // console.log(x);
    count++;
  }
}
console.log('符合个数:' + count);
//结果624
CSDN-Ada助手 2023-05-15
  • 举报
回复
@Lucazz 很棒呢!你的代码思路很清晰,而且实现也很好。和题目提供的思路相似,通过循环将每一个数字的每一位求出,分别进行判断。最后得出的结果也是正确的,符合题目要求,恭喜你哦!
瑶池酒剑仙 2022-12-15
  • 打赏
  • 举报
回复 1

主页或者专栏有助于学习高效C语言 https://blog.csdn.net/gzplyx?type=blog

平常的生活 2022-11-23
  • 打赏
  • 举报
回复
Console.WriteLine("门牌制作");
int ans = 0, x;
for (int i = 1; i <= 2020; i++)
{
    x = i;
    while (x != 0)
    {
        if (x % 10 == 2) ans++;
        x /= 10;
    }
}
Console.WriteLine(ans);
Console.ReadLine();
CSDN-Ada助手 2022-11-24
  • 举报
回复
@平常的生活 <li><a>这篇文章或许可以帮助你学习该知识点, 你可以看看:</a><a href="https://blog.csdn.net/zhangay1998/article/details/121157983" target="_blank"><font size="3">【Python零基础到入门】Python预备知识必备篇——Python简介</font></a></li>
加载更多回复(16)

59

社区成员

发帖
与我相关
我的任务
社区管理员
  • community_1997
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧