每日一题(10)——统计连续数字中1的个数
2015-08-14 15:30
316 查看
问题:
输入十进制数字N,统计从1到N的连续数字中,所有的1出现的次数。
例如:
•N = 3, f(3) = 1 (只有一位数字的情况)
•(两位数字的情况)
•N = 13, f(13) = 6 2+4
•N = 23 ,f(23) = 13 3+10
•N = 33, f(33) = 14 10+4
•……
•N = 99, f(99) = 20 10+10
•N = 123
•个位出现1个数:13
•十位数出现1个数:20
•百位出现1个数:24
•同理,我们可以分析4位数、5位数。。。
总结规律:
计算方法:可以通过分别计算每一位上出现1的次数,最后加和统计一共出现的次数
引出问题:
怎样计算某一特定位上1出现的次数?
假设N=abcde,要计算其百位上1出现的次数,
它受到三个因素的影响:百位以上的数字,百位以下的数字,百位上的数字。
当百位数字c=0时,百位上出现1的次数只受百位以上的数字影响
12045:百位上1出现的次数为12*100=1200 次
当百位数字c=1时,百位上出现1的次数只受百位以上的数字,百位以下的数字共同影响
12145:百位上1出现的次数为12*100+45+1 次
当百位数字c>1时,百位上出现1的次数只受百位以上的数字影响
12345:百位上1出现的次数(12+1)*100=1300次
其他各位也是依然这样计算。
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
void fun(int N)
{
int factor=1;
int count=0;
int low,cur,high;
while (N/factor)
{
low = N - (N/factor)*factor;
cur = (N/factor)%10;
high = N/(factor*10);
switch(cur)
{
case 0:
count += high*factor;
break;
case 1:
count += high*factor+low+1;
break;
default:
count += (high+1)*factor;
break;
}
factor *=10;
}
cout<<count<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==-1) break;
fun(n);
}
}
输入十进制数字N,统计从1到N的连续数字中,所有的1出现的次数。
例如:
•N = 3, f(3) = 1 (只有一位数字的情况)
•(两位数字的情况)
•N = 13, f(13) = 6 2+4
•N = 23 ,f(23) = 13 3+10
•N = 33, f(33) = 14 10+4
•……
•N = 99, f(99) = 20 10+10
•N = 123
•个位出现1个数:13
•十位数出现1个数:20
•百位出现1个数:24
•同理,我们可以分析4位数、5位数。。。
总结规律:
计算方法:可以通过分别计算每一位上出现1的次数,最后加和统计一共出现的次数
引出问题:
怎样计算某一特定位上1出现的次数?
假设N=abcde,要计算其百位上1出现的次数,
它受到三个因素的影响:百位以上的数字,百位以下的数字,百位上的数字。
当百位数字c=0时,百位上出现1的次数只受百位以上的数字影响
12045:百位上1出现的次数为12*100=1200 次
当百位数字c=1时,百位上出现1的次数只受百位以上的数字,百位以下的数字共同影响
12145:百位上1出现的次数为12*100+45+1 次
当百位数字c>1时,百位上出现1的次数只受百位以上的数字影响
12345:百位上1出现的次数(12+1)*100=1300次
其他各位也是依然这样计算。
[cpp] view
plaincopyprint?
#include <iostream>
using namespace std;
void fun(int N)
{
int factor=1;
int count=0;
int low,cur,high;
while (N/factor)
{
low = N - (N/factor)*factor;
cur = (N/factor)%10;
high = N/(factor*10);
switch(cur)
{
case 0:
count += high*factor;
break;
case 1:
count += high*factor+low+1;
break;
default:
count += (high+1)*factor;
break;
}
factor *=10;
}
cout<<count<<endl;
}
int main()
{
int n;
while(cin>>n)
{
if(n==-1) break;
fun(n);
}
}
相关文章推荐
- hdoj 3342 Legal or Not 【拓扑排序 判断是否存在可行解】
- ubuntu erlang安装
- 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)
- Intent详解以及实例
- ACdream 1157 Segments
- Linux下抓包工具tcpdump以及分析包的工具wireshark
- 每日一题(1)——滑雪问题(动态规划)
- 每日一题(4)——动态规划《Introduction to Algorithms》总结篇
- HDU 5294 Tricks Device 残余网络(最短路+最大流)**
- Android应用开发原理之从源码分析看Linearlayout、Relativelayout,Framelayout的布局差别(Relativelayout分析)
- Ionic开发入门
- 查询当前文件夹中文件数量
- CSS基础
- 开源项目(VC++,MFC)
- VS2013常用快捷键
- 【JS】垃圾回收和块级作用域
- Android API的Activity类
- 每日一题(17)——调整一摞饼(递归)
- Android 中比 Timer 更好方法
- Activity对象的onCreate方法真是Android程序的入口吗?