给定一个十进制的正整数N,计算从1开始到N的的所有整数中1出现的个数

编程读书笔记(3) 统计在从1到n的正整数1出现的次数 问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1个数是5。 问题一: 写一个函数f(N),返回1到N之间出现1个数,比如f(12)= 5。 解法一: 让我们首先想到 阅读详情

这个题目看似很简单,其实是一个复杂的过程。

(一)如果按照平常的思路,依次遍历1到N计算1出现的次数,这样做非常的简单,但是时间是一个苦恼的问题,运算量过大

按照平常思路的代码如下:

#include <iostream>

using namespace std;

int getCount(int num)
{
	int count = 0;
	while(num)
	{
		count+=(num%10==1?1:0);
		num /= 10;
	}
	return count;
}

int main()
{
	int num;
	cout<<"请输入一个整数"<<endl;
	cin>>num;

	int count = 1;
	for(int i=2; i<=num; i++)
	{
		count+=getCount(i);
	}
	cout<<count<<endl;

}


(二)大家看到这个题的时候,肯定会想到这个题会有更优的解法,我在看这个题目的时候由于没有静下心来思考,整理的逻辑非常的混乱,不过我相信,只要静下心来就可以找到规律。

假设有一个正整数:abcde我们只需要讨论在a,b,c,d,e各个位上出现1的次数即可,最终的结果就是把每次出现1的次数加和。

现在讨论c位上出现1的次数:分为三种情况

(1)c=0,例如abcde=12013,则c位为1的数字有100-199,1100-1199........11100-11199 一共是1200个c位为1的数,可见如果c=0,c位为1的次数为ab*(de的位数)

(2)c=1,例如abcde=12113,只看比第一种情况多了哪些带有1的数字,12100-12113多了14个数,可见如果c=1,c位为1的次数为ab*(de的位数)+de+1;

(3)c>1, 例如abcde = 12213 可知c位为1的数有(ab+1)*(de的位数)个

根据上述的规律,代码实现如下:

#include <iostream>

using namespace std;

int main()
{
	int num;
	cout<<"请输入一个正整数:"<<endl;
	cin>>num;

	int count = 0,temp=1;
	int former,mid,latter;

	while(num/temp != 0)
	{
		latter = num%temp;
		former = num/(temp*10);
		mid = (num/temp)%10;
		switch(mid)
		{
		case 0:
			count+=former*temp;
			break;
		case 1:
			count+=former*temp+latter+1;
			break;
		default:
			count+=(former+1)*temp;
		}
	
		temp *=10;		
	}

	cout<<count<<endl;
}


上述方法的时间复杂度只与整数N的位数有关。与第一种方法相比大大节省了时间。


 

 

1的数目   分析与解法【问题1的解法一】 这个问题看上去并一个困难的问题,因为需要太多的思考,我想大家都能找到一个最简单的方法来计算f(N),那就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,自然就得到了从1到N所有“1”的个数的和。写成程序如下:代码清单2-9 ULONGLONG Count1InAInteger(ULONGLONG n){ 阅读详情

相关推荐

Windows下构建ImGui.Net

工具 Visual Studio 2017 操作 下载项目 git clone https://github.com/mellinoe/ImGui.NET.git 编译 右键以下两个项目并调试: ImGui.NET.SampleProgram ImGui.NET.SampleProgram.XNA Error fix 中间遇到一些问题: SDK版本对 去微软官网下载安装对应版本 由于设置了代理被远程服务器拒绝连接 关闭代理(也许在环境变量中) nuget源无对应资源,404 NOT FOUN

jojozym的博客 1463

给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。DMU

给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。C语言程序附带实验报告

T527 uart串口配置导致系统进

T527 s_uart串口配置导致系统进去。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 653

1个数

总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字1”的个数。 例如:当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,1112。这样出现了5个“1”。 输入 正整数n。1 <= n <= 10000。 输出 一个正整数,即“1”的个数。 样例输入 12 样例输出 5 分析及代码: 分析:用k来计算总共有多少个1..

Fly_to_the__sky的博客 2592

给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字1”的个数。 例如当n=2时,写下1,2。这样只出现了1个“1”;当n=12时,写下1,2,3,4,5,6,7,8,9,10,

//请在此输入你的代码,复杂程序可先在DevC++中运行调试后再提交 #include<stdio.h> intmain() { intn,i,j,k,w=0,x; scanf("%d",&n); for(i=1;i<=n;i++) { k=i; for(j=0;k>0;j++) { x=k%10; k=k/

ck_zdn的博客 3448

1009 数字1的数量

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。Input 输入N(1 <= N <= 10^9)Output 输出包含1个数Input示例 12Output示例 5思路:  这种题就像是先解决大块的,简单容易计算的,断地减少,剩下边沿留着进行讨论。

海绵的博客 690

51nod 1009 数字1的数量(思维)

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 Input输入N(1 <= N <= 10^9)Output输出包含1个数Input示例12Output示例5两种方法:方法一:动态规划设d[i]表示首字母为1的i位数内有多少个1#include<iostream> #

HJ 794

51nod【1009 数字1的数量】做题总结

1009 数字1的数量 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 输入 输入N(1 <= N <= 10^9) 输出 输出包含1个数 输入样例 12 输出样例 5 思路:分位考虑,例如11111....

Anubizs的博客 390

51Nod-1009 数字1的数量【数位DP+记忆化搜索】

1009 数字1的数量  给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 Input 输入N(1 &lt;= N &lt;= 10^9) Output 输出包含1个数 Input示例 12 Output示例 5   问题链接:51Nod-...

海岛Blog 567

51Nod 1009-数字 1 的数量

数字 1 的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算 题目链接:点击打开链接 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 Input 输入N(

别止的博客 412

51nod 1009 数字1的数量【数位dp】

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 Input 输入N(1 <= N <= 10^9) Output 输出包含1个数 Input示例 12 Output示例 5 《《这篇写的挺好的》》 思路: 数位dp入门一下,讨论每个数位出现1的次数

王小二的博客 351

51nod 1009 数字1的数量

51nod 1009 数字1的数量【题目描述】【输入】【输出】【输入样例】【输出样例】【分析】 【题目描述】 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 【输入】 输入N(1 <= N <= 10 9) 【输出】 输出包含1个数 【输入样例】 12 【输出样例】 5 【分析】 两种方法: 方法一:常规解法,计算1~n,每个数中含1的数量,累加求和; ——问题:n个

jkask的博客 178

51Nod - 1009~ 数字1的数量

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。 例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。 Input 输入N(1 &lt;= N &lt;= 10^9) Output 输出包含1个数 Sample Input 12 Sample Output 5 这个题刚开始直接想到的就是打表,但是这个...

gao506440410的博客 260

数字1的数量

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1个数。例如:n = 12,包含了5个11,10,12共包含3111包含2个1,总共5个1。Input输入N(1 &lt;= N &lt;= 10^9)Output输出包含1个数Input示例12Output示例5解法:       1位数的情况:       大于等于1的时候,有1个,小于1就没有。       2...

第一楼主的博客 1275

<编程>给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1个数

这个是《编程》上的一个题目,题目如题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有1个数。 书上给出了两个解法,第一个就是笨方法,挨个数呗,最后加一块。 第二个解法,有兴趣的自己看书上的分析吧,这里先把Java实现的代码贴下: public static long F_Sum1s(long n){ long iCount = 0; long

beifeng600的专栏 5986

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

问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1个数是5。 问题一: 写一个函数f(N),返回1到N之间出现1个数,比如f(12)= 5。 解法一

lvmengmeng 7721

学习笔记9:计算n个正整数对应二进制中1个数

#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d",&n); int a; int b=1; int c=1; int sum[100]={0}; while(b<=n) { scanf("%d",&a); do { sum[b]+=a%2

你误入了一条咸鱼的博客 2045

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

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

2004

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

一、题目: n给定一个十进制正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。 n要求: n写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。 n在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。 二、解题思路: 无。 三、程序源码: import java.util.*; public c...

weixin_33976072的博客 2180

2023-07-11给定正整数 n, 返回在 [1, n] 范围内具有 至少 1 位 重复数字正整数个数。 输入:n = 100。 输出:10。

2023-07-11给定正整数 n,返回在 [1, n] 范围内具有 至少 1 位 重复数字正整数个数。输入:n = 100。输出:10。

福大大架构师每日一题 1万+

oa办公系统数据库设计.doc

oa办公系统数据库设计.doc

上一篇: 寻找“发帖”水王
下一篇: c++ - bool类型
阿木木的忧伤
博客等级 码龄16年 20粉丝 84原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值