给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)
来源:互联网 发布:店宝宝软件怎么样 编辑:程序博客网 时间:2024/06/05 11:40
编程之美上的一道题目,原文分析的方法十分简单,并且很容易程序实现。分析:
若x = abcde,我们来看百位为1出现的次数,这里分3种情况讨论:
1. 百位为0时,假设x = 45021,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
总共是45*100个1
2. 百位为1时,假设x = 45121,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
45100~45145
总共是45*100+(45+1)个1
3. 百位大于1时,假设x = 45821,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
45100~45199
总共是(45+1)*100个1
于是,我们可以找到这样一个规律,对于某一特定的位,该位出现1的次数为:
1. 若该位的值为0,则该位出现1的次数=高位值*该位的进制
2. 若该位的值为1,则该位出现1的次数=高位值*该位的进制+低位值+1
若x = abcde,我们来看百位为1出现的次数,这里分3种情况讨论:
1. 百位为0时,假设x = 45021,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
总共是45*100个1
2. 百位为1时,假设x = 45121,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
45100~45145
总共是45*100+(45+1)个1
3. 百位大于1时,假设x = 45821,可以算出百位为1出现情况:
100~199
1100~1199
...
44100~44199
45100~45199
总共是(45+1)*100个1
于是,我们可以找到这样一个规律,对于某一特定的位,该位出现1的次数为:
1. 若该位的值为0,则该位出现1的次数=高位值*该位的进制
2. 若该位的值为1,则该位出现1的次数=高位值*该位的进制+低位值+1
3. 若该位的值大于1,则该位出现1的次数=(高位值+1)*该位的进制
代码:
#include <stdio.h>int find_1(int n){int factor;int res;int low, cur, high;factor = 1;res = 0;while(n / factor){low = n % factor;cur = n / factor % 10;high = n / factor / 10;if(cur == 0) res += high * factor; else if(cur == 1) res += high * factor + low + 1; else res += (high + 1) * factor;factor *= 10;}return res;}int main(){int res;int n = 19;printf("%d contains %ds one.\n",n, find_1(n));}
转载地址:http://t.jobdu.com/thread-98638-1-1.html
- 给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)
- 给定一个N,求1-N之间有多少可以输出的数。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3628800,N!的末尾有两个0。
- 给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?求N!的二进制表示中最低位1的位置。
- 有一个整数n,写一个函数f(n),返回0~n之间出现的“1”的个数,例如f(1)=1; f(13)=6(1,10,11,12,13一共6个1),最大的f(n)=n的n是多少
- 对于一个数字,我们可以直观的了解到它所含有的数字,例如: 3243中包含1个2、2个3、1个4。 那么,给你一个数n,求从1到n之间的所有这些数字中,总共包含多少个m。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
- 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
- python求解给定一个整数N,求N!末尾有多少个0,求N!的二进制中最低位1的位置
- 每日一题:给定n, 求出小于n的所有数中1的位数
- A的大小为n,其中的每相邻的两个元素之间差的绝对值为1,例如A={4 5 6 5 6 7 8 9 10 9},给定A和t,设计一个程序,求出t在A中的位置
- 取值为[1,n-1] 含n 个元素的整数数组至少存在一个重复数,O(n) 时间内找出其中任意一个重复数
- 已知一个整数n,写一个函数f(n),返回0~n间,每个数中出现的“1”的个数,问最大的F(n)= n中n为多少
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- 求出1…n之间的所有亲和数
- 求出1…n之间的所有亲和数
- 金蝶EAS BOS开发之扩展表应用
- 举例说明这些键的用法
- C++指针
- 详解EJB技术及实现原理
- C#调用SQL SERVER存储过程
- 给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)
- MFC 如何添加自定义消息
- 错误整理:容器启动报错com.sun.faces.config.WebConfiguration cannot be cast to com.sun.faces.config....
- jquery的css操作
- PowerDesigner系列: 建立数据库模型
- PHP安全基础 - 验证与授权[整理]
- Bool 和 BOOL 的区别
- Sql rollup用法
- 显示EAS标准单据自带kdtable(kdtEntry) 右键导出 excel菜单