从1到整数n中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共出现了5次。

不考虑时间效率的解法:

 1 int NumberOf1Between1AndN(unsigned int n)
 2 {
 3  int number=0;
 4  for(unsigned int i=1;i<=n;++i)
 5  number +=NumberOf1(i);
 6  return number;
 7  }
 8 int NumberOf1(unsigned int n)
 9 {
10  int number=0;
11  while(n)
12  {
13   if(n%10==1)
14   number++;
15   n=n/10;
16  }
17 return number;
18 }

从数字规律着手明显提高时间效率:

 1 int Numberof1Between1AndN(int n)
 2 {
 3  if(n<=0)
 4  return 0;
 5  char strN[50];
 6  sprintf(strN,"%d",n);//将整数转换为字符串
 7  return NumberOf1(strN);
 8  }
 9
10  int NumberOf1(const char* strN)
11 {
12  if(!strN||*strN<‘0‘||*strN>‘9‘||*strN==‘\0‘)
13  return 0;
14  int first=*strN-‘0‘;
15  unsigned int length=static_cast<unsigned int>(strlen(strN));
16  if(length==1&&first==0)
17  return 0;
18  if(length==1&&first>0)
19  return 1;
20
21  int numFirstDigit=0;
22  if(first>1)
23  numberFirstDigit=PowerBase10(length-1);
24  else if(first==1)
25  numFirstDigit=atoi(strN+1)+1;//将字符串转换为整数
26
27  int numOtherDigits=first*(length-1)*PowerBase10(length-2);
28  int numRecursive=NumberOf1(strN+1);
29
30  return numFirstDigit+numOtherDigits+numRecursive;
31 }
32
33 int PowerBase10(unsigned int n)
34 {
35  int result=1;
36  for(unsigned int i=0;i<n;++i)
37  result *=10;
38  return result;
39  }
40  
时间: 2024-10-07 16:54:02

从1到整数n中1出现的次数的相关文章

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

1049. Counting Ones/整数中1出现的次数(从1到n整数中1出现的次数)

The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12. Input Specification: Each inp

结对开发之返回一个二维整数数组中最大联通子数组的和

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个整数数组中最大子数组的和4

题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二维数组首尾相接,象个一条首尾相接带子一样. 3 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 4 求所有子数组的和的最大值.要求时间复杂度为O(n). 设计思想 目前的解决方案是最笨的方法,穷举,所以时间复杂度达不到题目的要求,还需要进一步的寻找答案 源代码 题目:返回一个二维整数数组中最大子数组的和. 要求: 1 输入一个二维整形数组,数组里有正数也有负数. 2 二

返回一个首尾相接的二维整数数组中最大子数组的和

一.题目:返回一个二维整数数组中最大子数组的和. 二.要求: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数组的和的最大值. 三.解题思路: 将两个同样的数组首尾相接合并成一个数组,在用以前求二维数组最大子数组的方法求解 四.源代码: #include<iostream> using namespace std; #include"math

整数数组中最大子数组的和有溢出如何处理

一.实验题目: 返回一个整数数组中最大子数组的和. 二.实验要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 要求程序必须能处理1000 个元素:, 每个元素是int32 类型的: 求所有子数组的和的最大值. 三.实验思路: 这次的实验是在上次的基础上改进的,初看上去需要进步的地方不大,但是 仔细想起来,确实难度不小.处理1000个元素,很容易内存溢出:然后每 个元素是int32类型的,这很容易数据溢出.这次的实验着重的要解决这个

软件工程课堂练习:返回一个一维整数数组中最大子数组的和

题目:返回一个一维整数数组中最大子数组的和.要求:输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划. 经分析讨论设计思路如下: 1.定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数: 2.设置长度为10的循环依次以前十个数为头进行最大子数组的计算: 3,再设置一个数组用来存储