博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
积累1数
阅读量:4348 次
发布时间:2019-06-07

本文共 1130 字,大约阅读时间需要 3 分钟。

http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2154

如以下的问题:特定1十进制整数N,从计算1至N所有整数“数字1”出现次数

例如:N=12,序列={1,2,3,4,5,6,7,8,9,10,11,12},当中出现“1”的个数是5。故f(12)=5

解法:对于此题,《编程之美》中给出了一个巧妙的解法。

主要思路是:将总结果拆分成几个结果的和,如对于一个5位的整数abcde,序列中百位上出现1的次数受百位上的数字c影响。千位上出现1的次数受b影响,依此类推;最后将各个数位上1出现的次数加起来即为总和。

归纳总结。分成下面三种情况:以百位上的数字c为例:

1.假设c=0。则1在百位出现的次数受高位上的数字影响,为高位数字ab*100(100为当前乘数因子,在个位时为1,十位为10,百位为100等等)

2.假设c=1;则1在百位出现的次数既受高位影响,也受低位影响,高位影响的个数为高位数字ab*100(当前因子)。低位影响的个数为低位数字de+1

3.假设c>1。则1在百位出现的次数仅受高位上的数字影响。为(ab+1)*100(当前因子)

cpp代码:

#include 
using namespace std;int CountOne(int num){ int mod,cnt=0,factor=1; int tmp=num; while(num!=0){ mod=num%10; switch(mod){ case 0: cnt+=(tmp/(factor*10))*factor; break; case 1: cnt+=(tmp/(factor*10))*factor+(tmp%factor)+1; break; default: cnt+=(tmp/(factor*10)+1)*factor; break; } num/=10; factor*=10; } return cnt;}int main(){ int n; while(cin>>n){ cout<
<

转载于:https://www.cnblogs.com/mengfanrong/p/5038676.html

你可能感兴趣的文章
Map 地图
查看>>
Visual studio 2008下用SWIG包裹C/C++代码给Perl调用(Windows XP)
查看>>
处理html转码
查看>>
设计模式之观察者模式
查看>>
(零)TCP/IP详解综述
查看>>
u盘中毒后文件被隐藏了
查看>>
Mysql用户管理
查看>>
今日笔记
查看>>
perl中的反勾号(``),system和exec
查看>>
Js的核心:找到DOM
查看>>
JS十进制转二进制(控制位数)
查看>>
jQuery技术内幕电子版5
查看>>
自己写的Lucene实例
查看>>
B2B电子商务网站技术框架
查看>>
队列应用场景,自己实现队列
查看>>
使用Jenkins自动编译 .net 项目
查看>>
Vue.js的从入门到放弃进击录(一)
查看>>
ionic新入坑-环境搭建+新建项目+打开低版本项目处理
查看>>
使用telnet模拟redis从服务器
查看>>
ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)
查看>>