课堂练习——寻找1出现的次数

一、题目要求

  给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。   要求:   写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12)  = 5。   在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。

二、设计思想

看到这个题时第一感觉就是可以用最基本的方法通过遍历的来找出1出现的次数,但是我们可以从这里面找出其中的规律,一个数中含有1的个数为个位出现的次数、十位出现的次数、百位出现的次数的和的总个数;通过分析可以知道如果是一位数则个位出现的次数只有两种情况0和1,如果是两位数十位不是0那么个位出现1的次数是十位上的数加1,十位上出现1的次数与十位上的数字有关如果十位上是1则出现的次数是个位上数字加1,如果大于一则出现10次。可以看出每一位出现1的次数与高位,低位和本身有一定的关系。通过总结可以得到,十进制数abcde计算百位上(c)出现1的次数,如果百位上是0,则百位上出现1的次数是(ab)*100,如果百位上是1,则百位上出现1的次数是(ab)*100+cde+1,如果百位上数字大于1.则百位上出现1的次数是(ab+1)*100。

三、源代码

#include <iostream.h>

int find(int num)

{

    int count=0;//定义一个存储1的个数的变量

    int temp;//定义一个缓存的变量

    for(int i=1;i<=num;i++)

    {

        temp=i;

        while(temp!=0)

        {

            if(temp%10==1)

            {

                count++;

            }

            temp=temp/10;

        }

    }

    return count;

}

int main(void)

{

    int num1;

    cout<<"请输入数:";

    cin>>num1;

    cout<<"包含1的个数是:"<<find(num1)<<endl;

    return 0;

}

四、结果截图

五、总结

通过本次练习,我明白了编程思想的重要性,你要想把一个程序写好,不管是大是小,你都要有一个好的思路去解决这个问题,当你想到一个方案时,不要高兴的太早,你要去想一想还有没有更好的方法来解决该问题,或者怎么去优化现在的方案,这些都会是问题变得简单明了起来!

时间: 2024-10-18 22:52:57

课堂练习——寻找1出现的次数的相关文章

寻找数组中重复次数最多的数

#include<iostream> #include<map> using namespace std; int helper(const int a[],const int n) { map<int,int> m; for(int i = 0;i<n;i++) m[a[i]]++; map<int,int>::iterator comp = m.begin(); for( map<int,int>::iterator it = comp

LeetCode 501. Find Mode in Binary Search Tree(寻找二叉查找树中出现次数最多的值)

题意:寻找二叉查找树中出现次数最多的值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int ma = 0; int cnt = 1; TreeNode

课堂练习——寻找水霸

一,题目:随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二,思路:(1)将所有的ID号从小到大进行排序,然后分别统计各个ID号的个数,找出其中出现次数超过1/4的ID号,即为所求,但时间复杂度过于复杂. (2)在思路一排序的基础上,三个水霸的ID号分别在1/4,1/2,3/4处. (3)在上一堂课寻找水王的基础上,寻找水霸即为消去连续的4个不同的ID. 三,程序: #include <iostre

寻找数组中出现次数超过一半的数字

[题 目]数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字. [思 路1]由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我们的任务就是对该数组进行排序,而性能最好的快速排序的时间复杂度为O(nlogn),我们可以直接借助库函数完成,由于其效率不是很高,所以这里就不再赘述. [思 路2]对于一个数组中的元素的次数的统计,最快的查找方法是什么?当然哈希表了!我们能不能建立哈希表呢,稍微思考,我们就可以发现,哈希表只适用于

软件工程课堂作业——寻找水王2

一.题目 随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了总和的1/4.你能从发帖列表中快速找到他们吗? 二.设计思想 根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次.则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一.运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了

软件工程课堂作业——寻找“水王”

一.题目 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思想: 由于该“水王”发帖数目超过了帖子数目的一半,可以通过相邻两个帖子的作者ID是否相同来寻找.如果相邻两个ID不同,则将两个ID略过:若相等,则判断之前是否有怀疑是“水王”的ID,如

课堂练习——寻找水王

一,题目 •三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. •如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二,思路 思路1:因为各个人的id号大小不同,因此可将所有人的id号按照从小到大的顺序进行排序,用快速排序法,时间复杂度为:O(N*logN).然后遍历整个数组,统计每个id号出现的次数,出

实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title>test</title> <script> // 获取字符串中出现次数最少的字符 function getRareChar(str) { let hash = {}; // 将各个字符名字.首次出现位置及出现次数存到hash表 for(le

课堂作业--寻找水军

一.题目要求 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗? 二.设计思路 本次题目是在上次寻找“水王”的基础上进行拓展,设计思路和上次的相似,上次寻找水王是用的一个水王变量,一个计数变量,那么本次的设计思想沿用上次的技巧,有三个水军变量,三个计数变量:分别使水军的这三个变量和下一个数比较,然后和三个水军相对应的计数变量分别进行计数,相同则加一,不同则抵消减一:依次循环,和水王的规则类似,最后找到3