题目要求:

  给定 一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。

   例如:N = 2,写下1,2.这样只出现了1个“1”。

         N = 12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12.这样,1的个数是5.

  参考资料:编程之美2.4 1的数目

题目分析:

  方法1:遍历从1~N的所有数,每个数对10取余,如果余数为1,则有一个1.

  方法2:只分析N,不用逐个遍历。怎么分析呢?把N按个位、十位、百位、、、等来估算从1~N的所有数的个位、十位、百位、、、的每一位的1的总数。其中每一位又和它的高位和低位和本位都有关系,如:所有的十位的1的总和,可能和比它低的个位有关,可能和十位本身有关,可能和比十位大的百位、千位有关。。。

代码实现:

方法1代码:

#include <stdio.h>

int Count1(int n)
{
int iNum=;
while(n!=)
{
iNum += ((n% == )?:);
n/=; }
return iNum;
} int Count2(int n)
{
int iCount=,i;
for(i=;i<=n;i++)
{
iCount+=Count1(i);
}
return iCount;
} int main()
{
int i; for(i = ;i < ;i++)
{
printf("%d里面含有 %d 个1\n",i,Count2(i));
} return ;
}

方法2代码:

#include <stdio.h>

int Sumls(int n)
{
int iCount=,iFactor=,iLowerNum=,iCurrNum=,iHigherNum=;
while(n/iFactor!=)
{
iLowerNum=n-(n/iFactor)*iFactor;
iCurrNum=(n/iFactor)%;
iHigherNum=n/(iFactor*); switch(iCurrNum)
{
case :
iCount+=iHigherNum*iFactor;
break;
case :
iCount+=iHigherNum*iFactor+iLowerNum+;
break;
default:
iCount+=(iHigherNum+)*iFactor;
break; }
iFactor*=; }
return iCount;
} int main()
{
int i; for(i = ;i < ;i++)
{
printf("%d里面含有 %d 个1\n",i,Sumls(i));
} return ;
}

最新文章

  1. [LeetCode] Walls and Gates 墙和门
  2. 20155324王鸣宇对C语言课程回顾及对Java的展望
  3. C#客户端Redis服务器的分布式缓存
  4. Bind的DNS解析设置forward - 阿权的书房
  5. Touch ID集成
  6. 8大排序算法图文讲解 分类: Brush Mode 2014-08-18 11:49 78人阅读 评论(0) 收藏
  7. Java 如何连接 SQL 2008 R2
  8. React Native在虚拟运行app时,报错RCTRootView not found,怎么解决?
  9. MySQL数据库事务剖析
  10. 某外企mono for android试题
  11. [Codecademy] HTML&amp;CSS 第三课:HTML Basic II
  12. 【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)
  13. 数据库连接池c3p0的设置
  14. 在javaScript中检测数据类型的几种方式
  15. Vue 创建组件的方式
  16. select添加option
  17. (2)Django入门
  18. 消息队列Kafka学习记录
  19. 淘宝开放平台TOP SDK调用对接淘宝或天猫
  20. 如何使DIV居中

热门文章

  1. Java基础语法(练习)
  2. keil下JLINK在线调试仿真设置,SWD连接
  3. 2017.10.4 QBXT 模拟赛
  4. hdu 3861 The King’s Problem
  5. 使用Timer组件制作左右飘动的窗体
  6. poi实现Excel输出
  7. javaweb基础(21)_两种开发模式
  8. 伪基站SSRP
  9. 数据类型-------JavaScript
  10. 使用lua实现Spine动画的预加载