找"1"

题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的次数。

要求:1.写一个函数f(N),返回1到N之间出现“1”的个数。例如f(12)=5。

2.在32位整数范围内,满足条件的f(N)=N的最大N是多少。

#include<iostream>
using namespace std;

int search(int n)
{
    int a,m=10,k,x;

    x=0;
    k=n;
    do
    {
        a=k%10;

        if(a>1&&a<=9)
            x=x+(n/m+1)*m/10;
        else if(a==1)
            x=x+(n/m)*m/10+n%(m/10)+1;
        else if(a==0)
            x=x+(n/m)*m/10;

        m=m*10;
        k=(k-a)/10;
    }
    while(m<=(n*10));

    return x;
}
void main()
{
    int n,x,y,k;

    cout<<"输入一个整数:"<<endl;
    cin>>n;

    k=search(n);
    cout<<n<<"以内有"<<k<<"个1."<<endl;

    do
    {
        n++;
        y=search(n);
    }
    while(y==k);

    cout<<"含有"<<k<<"个1的最大整数为:"<<n-1<<endl;

}

思路:一1,个整数内有几个1和它每一位的数有关,即要判断个位,十位,百位各有多少个1。比如123这个数,它个位是3>1,那么这个数个位上就有1,11,21,31....121,

一共有13个“1”,十位是2>1,有10,11,12,13.....19;110,111,112.....119,一共20个“1”。百位是1,一共有100.....123,一共24个“1”。多列举几个数可以发现,每一位上分为三种情况:2~9,0和1;只要分别处理就行。

2~9:个位有(N/10+1)*1个;十位有(N/100+1)*10个,百位有(N/1000+1)*100个.......

1:个位有(N/10)*1+1个,十位有(N/100)*10+(N%10)+1个,百位有(N/1000)*100+(N%100)+1个....

0:有N/10个

感悟:一开始一直没有发现规律,一直做不出来,知道自己思路不对想改变思路,但还是会想着想着想回原来的思路,结果更乱了,心情也会烦躁。最后是睡了一觉,醒了之后就做出来了,不过可能还是可以优化。这次最大的感悟就是当发现自己思路不对时,不妨休息一下或与别人讨论讨论,自己硬想有时候只是浪费时间,钻牛角尖。当发现自己走进误区时一定要想办法走出来,而不是一味坚持己见。

时间: 2024-08-01 07:23:20

找"1"的相关文章

Class热替换与卸载

概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用.本文主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理. Class热替换 ClassLoader中重要方法: loadClass:ClassLoader.loadClass(…) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader加载器加载没有加载过的class,调用的方法的入口就是

PostgreSQL中查找最大连续性字段

一.建表 lihao=#create table tb (id int,pid int,name varchar); lihao=#INSERT INTO tb VALUES (1, 0, '广东省'); lihao=#INSERT INTO tb VALUES (2, 0, '浙江省'); lihao=#INSERT INTO tb VALUES (3, 2, '衢州市'); lihao=#INSERT INTO tb VALUES (4, 2, '杭州市'); lihao=#INSERT I

Java对List对象进行排序

有时候需要对List对象进行排序,如果每一处都去写一个排序方法,就会产生重复代码的坏味道,而且每一处都写,工作量会很大.我们知道,Java提供了一个Collections.sort()方法可以对List排序,利用Java反射机制,很容易就能写出一个通用的排序方法. 为了防止出现不按照getter,setter规范命名的POJO类,我不打算动态调用getXXX()方法,而是直接获取对象的属性值.为了达到不论是否是public成员变量,都能获取到的目的,在获取到Field后,调用了setAccess

心若迅雷会员账号获取器

心若迅雷会员账号获取器是一个绿色免费的迅雷会员获取小工具,每天都会发布多个有效的迅雷会员账号供大家使用,用户可以使用这些账号登陆迅雷进行离线下载. 获取迅雷白金会员一人一号说明以及流程:点击下面的(立即获取白金会员一人一号)进行获取,会自动打开一个软件安装提示,点击(立即点击安装)然后点软件上的注册账号然后通过注册的账号登陆视频聊天软件,然后随便进个房间免费观看2分钟视频,2分钟以后软件自动发送一人一号白金账号到你邮箱!如果按操作后没发送到自己邮箱请联系客服QQ:1625223157领取一人一号

c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)

如果直接放在项目运行目录,例如bin/debug可以直接加载,但是这样比较乱. 如果在放debug里面的一个文件夹里面,有可能会报错“无法加载xxx.dll 找不到指定的模块”. 如果路径写成这样就会报错 framework/linphone 解决方法:将/ 改成"\" framework\linphone

游戏开发 系统app开发游戏定制开发找谁

梦幻珍珠港理财拆分游戏系统软件开发怎么做?找[江生:185-2911-8412 微电]. 梦幻珍珠港拆分游戏平台开发.梦幻珍珠港理财全网模式开发.梦幻珍珠港收益模式介绍开发. 梦幻珍珠港拆分游戏系统源码搭建平台!!我们是软件开发,玩家勿扰!非平台客服,玩家勿扰!] 游戏规则: 一.开发新会员要从您的库房扣除3 03颗珍珠,体系扣除5颗珍珠,新会员有298颗珍珠. 二.推荐老友,推荐人能够得到第一代会员的2%,第二代会员的1%,第三代会员的0.5%,一代的收益就是5.96颗珍珠奖赏(可转换为等量可

18-硬币找零

/*                                     硬币找零 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述    在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资.    我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05,    0.02,0.01 元,采用这些硬币我们可以对任

PAT乙级-1037. 在霍格沃茨找零钱(20)

如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易."现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱. 输入格式: 输入在1行中分别给出P和A,格式为"Galleon.Sickle.Knut",其间用1个空格分隔.这里Galleon是[0, 107]区间内的整数,Sickle是[0, 17)区间

十九. 想高速开发app,须要找外包吗?

健生干货分享:第19篇 摘要:近期和两位准备开发app的创业者聊天,他们之前没有移动互联网的相关经验.有的是想法和资金.他们在纠结:想高速开发app,须要找外包吗? 近期和两位想开发app的创业者聊天.他们之前没有移动互联网的相关经验.有的是想法和资金.因为没有移动互联网的相关经验,想高速开发app.但又怕组建技术团队的时间过长.影响产品的开发.询问了我一些找外包的事项,我就在这篇文章里整理一下我的一些看法.下面的这些论述.都是针对整个app外包的情况(包括设计稿,原型图,前后端). 1.找外包

Hyper-V虚拟机Redhat添加网卡找不到网卡配置文件解决方法

环境:Hyper-V虚拟机上面安安装Redhat6.7 问题:系统安装时,只有一块网卡,现根据需要,增加一块网卡,DHCP获取IP地址,在Hyper-V设置中增加网卡后,存在连个问题:1./etc/sysconfig/network-scripts/中找不到配置文件且无法连接外网 解决方法: 1.cat /etc/udev/rules.d/70-persistent-net.rules 查看网卡的MAC地址和网卡名称 2. 在/etc/sysconfig/network-scripts/下建立i