1的数目
2016-02-29 14:54
260 查看
题目描述:给定一个正整数N,写出从1到N所有整数,然后数一下其中出现的所有1的个数。
例如:
N=2, 写下1, 2 这样只出现一个1
N=12,写下1 ,2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12.这样出现1的个数是5.
问题是写出一个函数f(N)表达1出现的个数,其中n 的大小为32位。
解答:
1. 最简单也是最蛮力的做法就是枚举,把每个数都找出其中出现1的个数
while(n!=0){
num+= (n%10==1)? 1:0;
n /= 10;
}
这种暴力的方法只适合于数据比较小的时候。时间的复杂度为Nlog2(N),
2.我们来仔细的归纳对于给定的N,似乎可以分析每一位上可能出现1的次数,之和来得到结果。假设N=13
十位出现1的个数 4
个位出现1的个数 2
F(N)= 4+2 = 6;
假设N=abcde, a,b,c,d,e分别表示十进制各个位数上的数字。如果要计算百位出现1的次数,它将会受到三个因素的影响。当百位,百位以下,百位以上。
如果百位为0, 则由高位决定,比如12013, 可知道百位出现1的个数100-199, 1100-1199, 2100-2199,。。。。11100-11199.一共是1200个。也就是高位数字12决定,12*100。
如果百位为1,则由高位12*100决定,并且有12100-12113,一共114个,等于地位113+1.
如果百位大于1,则由更高位决定,比如12213百位出现1 的可能个数100-199, 1100-1199, 2100-2199.。。。。。 12100-12199一共是1300个,并且等于更高位数字(12+1)*100
所以归纳出的代码是:
#include<iostream>
using namespace std;
int main() {
long long n;
cin>>n;
long long factor = 1;
long long low = 0;
long long curr = 0;
long long high = 0;
long long count = 0;
while(n/factor != 0) {
low = n - n/factor*factor;
curr = (n/factor)%10;
high = n/(factor*10);
switch(curr){
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;
system("pause");
}
例如:
N=2, 写下1, 2 这样只出现一个1
N=12,写下1 ,2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12.这样出现1的个数是5.
问题是写出一个函数f(N)表达1出现的个数,其中n 的大小为32位。
解答:
1. 最简单也是最蛮力的做法就是枚举,把每个数都找出其中出现1的个数
while(n!=0){
num+= (n%10==1)? 1:0;
n /= 10;
}
这种暴力的方法只适合于数据比较小的时候。时间的复杂度为Nlog2(N),
2.我们来仔细的归纳对于给定的N,似乎可以分析每一位上可能出现1的次数,之和来得到结果。假设N=13
十位出现1的个数 4
个位出现1的个数 2
F(N)= 4+2 = 6;
假设N=abcde, a,b,c,d,e分别表示十进制各个位数上的数字。如果要计算百位出现1的次数,它将会受到三个因素的影响。当百位,百位以下,百位以上。
如果百位为0, 则由高位决定,比如12013, 可知道百位出现1的个数100-199, 1100-1199, 2100-2199,。。。。11100-11199.一共是1200个。也就是高位数字12决定,12*100。
如果百位为1,则由高位12*100决定,并且有12100-12113,一共114个,等于地位113+1.
如果百位大于1,则由更高位决定,比如12213百位出现1 的可能个数100-199, 1100-1199, 2100-2199.。。。。。 12100-12199一共是1300个,并且等于更高位数字(12+1)*100
所以归纳出的代码是:
#include<iostream>
using namespace std;
int main() {
long long n;
cin>>n;
long long factor = 1;
long long low = 0;
long long curr = 0;
long long high = 0;
long long count = 0;
while(n/factor != 0) {
low = n - n/factor*factor;
curr = (n/factor)%10;
high = n/(factor*10);
switch(curr){
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;
system("pause");
}
相关文章推荐
- 一个关于if else容易迷惑的问题
- 一道sql面试题附答案
- C# 超高面试题收集整理
- 人人网javascript面试题 可以提前实现下
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)
- 10个经典的Java main方法面试题
- 小米公司JavaScript面试题
- 超级全面的PHP面试题整理集合第1/2页
- 极易被忽视的javascript面试题七问七答
- 5个实用的shell脚本面试题和答案
- PHP经典面试题集锦
- 8个PHP数组面试题
- PHP中提问频率最高的11个面试题和答案
- 用PHP解决的一个栈的面试题
- Android工程师面试题大全
- PHP面试题之文件目录操作
- 几道坑人的PHP面试题 试试看看你会不会也中招