微软面视:1的个数
来源:互联网 发布:服务器域名根目录在哪 编辑:程序博客网 时间:2024/06/15 20:36
问题描述:
给定一个十进制n,统计从 1 到 n的所有数中含有"1"的个数;
例如n=10;
那么 1 和 10都含有"1",即此时为2
要求:
算法的时间复杂度不得超过o(n);
具体方案:
分析:
xxxxx0xxxxx
xxxxx1xxxxx
xxxxx2xxxxx
xxxxx3xxxxx
....
.
.
.
xxxxx9xxxxx
不为"x"的数即我们要分析的数位,这个数位为"1"的情况可分为2部分:
高位相关(不包括该位),: 高位的数值*100000(该位在第六位)
低位相关(不包括该位),又分为2种情况:1)该位小于1,即为0 这是这个部分记0处理
2)该位大于等于1,这个部分记为: 低位数字值再加1
如此从低位到高位逐一考虑累加就会得到"1"的总个数.
具体代码(vs2005, win32,c++)
unsigned long count(unsigned long n);
int _tmain(int argc, _TCHAR* argv[])
{
printf("%ld/n",count(100));
return 0;
}
unsigned long count(unsigned long n)
{
unsigned long int num=0;
int CurNum;
unsigned long HighNum,LowNum;
//依次有低位到高位考虑1的个数
short int cur;
unsigned long int factor=1;
unsigned long int high;
unsigned long int low;
unsigned long int count=0;
while(n/factor)
{
//取出高位
high=n/(factor*10);
//取出低位
low=n%factor;
//取出当前位
cur=(n/factor)%10;
switch(cur)
{
case 0:
count+=(high*factor);
break;
case 1:
count+=(high*factor);
count+=(low+1);
break;
default:
count+=(high*factor);
count+=factor;
break;
}
factor*=10;
}
return count;
}
- 微软面视:1的个数
- 微软面试题,查找1的个数
- 【微软面试题】请计算出1的个数
- 24. 微软面试题:整数的二进制表示中1的个数
- 面试题10:二进制1的个数
- 面试题---二进制中1的个数
- 微软的面试题(答案)(1)
- 微软的面试题及答案(1)
- 1的数目-微软面试题
- 微软的面试题
- 微软的面试题
- 微软的面试题
- 微软的面试题
- 微软的面试题
- 微软的面试题
- 微软面试题--翻转数组中的一段,使0为1,1为0,求此数组中1的个数最多
- 完美解决微软求N包含1的个数
- 二进制数1的个数(微软笔试题)
- C/C++字节对齐
- [zz]用 VS 2005 生成 .NET 1.1 程序
- 直击传销陷阱的警世之作:传销洗脑实录
- vc调用dll
- 无法录制某些控件的解决办法
- 微软面视:1的个数
- WinAPI: FindWindow、FindWindowEx - 查找窗口
- (MSys+MinGW )FFmpeg工程编译 FFplay
- 《卓有成效的程序员》3月20日已由互动出版网做全国首发
- throw与throws区别
- Tips
- 录制时可以识别对象但回放时却没有执行该动作的解决办法
- 三字经
- Event