题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

题目描述:

亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

输入:

输入有多组数据,每组测试数据为一行。

每一行有两个整数a,b(0<=a,b<=1,000,000,000)。

输出:

对应每个测试案例,输出a和b之间1出现的次数。

样例输入:
0 5
1 13
21 55
31 99
样例输出:
1
6
4
7

主要思路:计算数字每一位出现1的次数,并相加,得到该数字中1出现的次数。

例如:1304中,个位出现1的次数,是131次,即1304/10 + 1 = 131;十位出现1的次数 (1304/100)*10  = 130;百位出现1的次数 (1304/1000 + 1)*100 = 200 ;千位出现1的次数( 1304/10000)*1000+1+1304-int(1304/1000)*1000 = 305 总计766;

总结一下,计算数字n中1的个数,得到以下规律:从个位开始,对每一位数字进行处理,先计算对10取余的余数rem,计算除以10以后的数字tmp,如果余数为0,则该位为1的数字个数为 base*tmp ;余数为1,该位为1的数字个数为n-int(n/base)*base +1 + tmp*base;base在每计算完一位数字后,乘以10,代码如下:

#include <stdio.h>

void swap(int *a, int *b)
{
	int tmp = *b;
	*b = *a ;
	*a = tmp;
}
int getNum1(int n)
{
	int num =0;

	int tmp,rem,base;
	base =1;tmp = n;

	while(tmp)
	{
		rem = tmp%10;
		tmp = tmp/10;
		if(rem == 0)
		{
			num+=base*tmp;
		}
		else if(rem == 1)
		{
			num  = num + (n - int(n/base)*base +1 + tmp*base);
		}
		else
			num += (tmp+1)*base;
		base *= 10;
	}

	return num;
}
int main()
{
	int low ,high;
	while(scanf("%d%d",&low,&high)!=EOF)
	{
		if(low <0 || high <0)
			continue;
		if(low > high)
			swap(&low,&high);
		if(low ==0)
		{
			printf("%d\n",getNum1(high));
			continue;
		}
		printf("%d\n",(getNum1(high)- getNum1(low-1)));
	}

	return 0;
}

题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

时间: 2024-10-14 02:52:34

题目1373:整数中1出现的次数(从1到n整数中1出现的次数)的相关文章

31.整数中1出现的次数(从1到n整数中1出现的次数)

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). highValue == 0 退出 1 # -*- coding:utf-8 -*- 2 class Solution: 3 def NumberOf1Between1And

从1到非负整数n中1出现的次数 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次, 但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化, 可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

/*从1到非负整数n中1出现的次数求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). */ import java.util.*; public class Class36 { public int NumberOf1Between1A

LoadRunner中Action的迭代次数的设置和运行场景中设置

LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value on选择 each occurence, 1. 迭代跟虚拟用户数没什么必然联系 迭代是这样的: 迭代1次   迭代2次  迭代3次 用户1     X1        

找出数组中两数之和为指定值的所有整数对

一,问题描述 给定一个整型数组(数组中的元素可重复),以及一个指定的值.打印出数组中两数之和为指定值的 所有整数对 二,算法分析 一共有两种方法来求解.方法一借助排序,方法二采用HashSet 方法一: 先将整型数组排序,排序之后定义两个指针left和right.left指向已排序数组中的第一个元素,right指向已排序数组中的最后一个元素 将 arr[left]+arr[right]与 给定的元素比较,若前者大,right--:若前者小,left++:若相等,则找到了一对整数之和为指定值的元素

保存ActionForm中未编辑的字段为NULL,尤其整数不赋0值

Struts中,如果ActionForm里某些字段没有编辑(即没有输入值),提交后直接保存到数据库时,这些字段保存为""(String)或0(int),可是在实际开发中,可能需要将其保存位null,如何实现呢? 最直观的办法:判断字段是否为空,如果为空,则返回null 最简单的办法:修改ActionServlet配置下init-param,具体如下 ActionServlet配置下init-param: 1 <init-param> 2 <param-name>

逻辑推理:在一个100条语句的列表中,第n条语句是“在这个列表中,恰有n条语句为假”,可以得出什么结论?

<离散数学及其应用>第六版1.1练习题第43题的个人分析 题目:在一个100条语句的列表中,第n条语句是"在这个列表中,恰有n条语句为假"..........     a)从这些语句中得出什么结论     b) 若第n条语句是"至少有n条语句为家",结论是什么     c)假设包含99条语句,回答b 答案网上都有,我是给出自己的分析过程:(思路大概是:如果这句话话为真,推出这句话的内容为真,由这句话的内容又能推出其余话的是不是为真,再根据其余话的内容来判

在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world

一.题目 编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world.内核版本要求2.6.18 ? 二.实验环境 物理主机:win7 64bit, i5双核,8G内存 虚拟机:Vmware Workstation 10.0.2 虚拟主机: CentOs-5.11,内核2.6.18 ? 三.实验思路 在着手解决问题之前,我在网上查阅了一些资料,大多是关于模块的介绍.linux内核采用的是模块化编程,这样可以很容易的添加或

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的.那么咋们今天闲来说说Android中的run-as命令吧. 二.遇到的问题&解决问题 Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查

std中vector的实现原理(标准模板动态库中矢量的实现原理)

我们实现的数据结构是为了解决在运行过程中动态的开辟空间使用(例如我们不停的输入,输入的多少我们不确定) 原理两种: 一.笨办法 我们第一次用多少空间,开辟多少空间A 我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据拷贝到B中,然后释放A,在C中写入新的数据 缺点:在于拷贝的次数太多,效率低 二.改进的办法 矢量有一个参数,里面填写预留的空间,加入我们填写的预留空间大小是B,这里是预留,并没有真正的开辟物理内存,预留的作用于如果这时候如果需要开辟空间做其他事情,开辟的空间会避开B,这样