给定一个正整数N,统计从1到N的整数中,出现“1”的个数(11这个数算出现两次)
2014-08-05 16:20
309 查看
思路:转换为每位出现1的次数 f(abcde) = f(a) + f(b) + f(c) + f(d) + f(e) f(e) = 个位出现1的次数。
先解释几个变量
iFactor:当前位置的十进制表示,如果当前位为个位,那么iFactor为1,当前位为十位,那么iFactor为10.....
iLowerNumber:比当前位置低的数字,如123,若当前位置为十位(2),那么它的iLowerNumber就是3....
iCurrentNumber:当前位置的数字。
iHigherNumber:比当前位置高的数字,如123,若当前位置为十位(2),那么它的iHigherNumber就是1....
算法:
每个位置出现1的次数又有三种情况:
1.该位置数字为0, result= iHigherNumber * iFactor;
2.该位置数字为1, result=iHigherNumber * iFactor + iLowerNumber +1;
3.给位置数字大于1,result= (iHigherNumber + 1) * iFactor;
大家可以自己举例测试上述公式,然后用数学归纳法进行总结,源码如下:
结果如下:
先解释几个变量
iFactor:当前位置的十进制表示,如果当前位为个位,那么iFactor为1,当前位为十位,那么iFactor为10.....
iLowerNumber:比当前位置低的数字,如123,若当前位置为十位(2),那么它的iLowerNumber就是3....
iCurrentNumber:当前位置的数字。
iHigherNumber:比当前位置高的数字,如123,若当前位置为十位(2),那么它的iHigherNumber就是1....
算法:
每个位置出现1的次数又有三种情况:
1.该位置数字为0, result= iHigherNumber * iFactor;
2.该位置数字为1, result=iHigherNumber * iFactor + iLowerNumber +1;
3.给位置数字大于1,result= (iHigherNumber + 1) * iFactor;
大家可以自己举例测试上述公式,然后用数学归纳法进行总结,源码如下:
package cn.gt.algori; /** * 给定一个正整数N,统计从1到N的整数中,出现“1”的个数 * @author gengtao * */ public class train0801_2 { public static void main(String[] args) { long number = 123; long start = System.currentTimeMillis(); System.out.println("总共出现1的个数为:"+Sum1s(number)); long end = System.currentTimeMillis(); System.out.println("耗时"+(end-start)+"毫秒"); } public static long Sum1s(long number){ long iFactor = 1; //获取高位的变量 long iLowerNumber = 0; int iCurrentNumber = 0; long iHigherNumber = 0; long iCount = 0; int i = 1;//计数第几位 while((number / iFactor) != 0){ iLowerNumber = number - (number / iFactor) * iFactor; iCurrentNumber = (int) ((number / iFactor) % 10); iHigherNumber = number / (iFactor * 10); long temp = 0; switch(iCurrentNumber){ case 0: temp = iHigherNumber * iFactor; break; case 1: temp = iHigherNumber * iFactor + iLowerNumber +1; break; default: temp = (iHigherNumber + 1) * iFactor; break; } System.out.println("倒数第 "+i+" 位出现1的个数为:"+temp); iCount += temp; iFactor *= 10; i++; } return iCount; } }
结果如下:
倒数第 1 位出现1的个数为:13 倒数第 2 位出现1的个数为:20 倒数第 3 位出现1的个数为:24 总共出现1的个数为:57 耗时0毫秒
相关文章推荐
- 给出101个整数数,这101个数是1~100中的数,其中只有一个是出现两次的数,要求找出这个数。
- leetcode:给定一个整数数组,除了一个元素外,每个元素都会出现两次。找到那一个。
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 给定一个正整数N,从1到N所有整数,计算出现1的个数
- 给定整数数组,除了一个元素之外,每个元素都会出现两次。 找到那个只出现一次的
- 给定一个字符串,请写一段代码找出这个字符串中首先出现两次的那个字符。
- 给定一个整数数组,1≤a [i]≤n(n =数组的大小),一些元素出现两次,其他出现一次 查找在该数组中出现两次的所有元素
- 新解:给定包含4 300 000 000个32位整数的顺序文件,如何找出一个至少出现两次的整数。
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 每天一道LeetCode-----一个整数序列,每个元素出现两次,只有一个(两个)出现一次,找到这个(这两个)元素
- 给定一个整数序列,确定这个序列中出现次数最多的整数和它出现的次数
- 给定包含4300000000个32位整数的顺序文件,如何找出一个出现至少两次的整数
- 提示用户输入的一个长度8位正整数数字 , 我们来统计这个数字中的每一位上出现的数字的重复次数 :
- 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 编程珠玑:给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 软件开发者面试百问-----有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。