编程之美之1的数目

来源:互联网 发布:ubuntu安装deepin qq 编辑:程序博客网 时间:2024/06/02 22:56


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

例如:

N=2,写下1,2。1只出现了1次。

1、写一个函数f(N),返回1到N之间,出现的“1”的个数,比如f(12)=5;

2、满足条件“f(N)=N”的最大的N是多少?


解法一:

从1遍历到N,计算每个数[1...N]上出现的1的次数。

public class Main {public static void main(String[] args) {int n = 100000000;System.out.println(fun(n));}private static int fun(int n) {int count = 0;for (int i = 1; i <= n; i++) {count += funExtra(i);}return count;}private static int funExtra(int n) {int count = 0;while (n > 0) {count += (n % 10 == 1) ? 1 : 0;n /= 10;}return count;}}

解法一的时间复杂度为O(N*log2(N))。

解法二:

从个位到遍历到最高位,计算每个位上面1出现的次数,同时进行累加。

例如:

N=12013

1、在个位上为3,则“1”出现的次数与前面的4位“1201”有关,出现“1”的次数为1201+1=1202次;

2、在十位上位1,则“1”出现的次数与前面的3位“121”和后面的“3”有关,出现“1”的次数为120*10+(3+1)=1204次;

3、在百位上位0,则“1”出现的次数与前面的2位“12”和后面的“13”有关,出现“1”的次数为12*100=1200次;

4、在千位上位2,则“1”出现的次数与前面的1位“1”和后面的“13”有关,出现“1”的次数为(1+1)*1000=2000次;

4、在万位上位1,则“1”出现的次数与后面的“2013”有关,出现“1”的次数为2013+1=2014次;

一共有7620个1。

其中,要注意的是必须对每个位上出现的数字分三种情况进行讨论:

1、“0”,

2、“1”,

3、“2,3,4,5,6,7,8,9”

代码如下:

public class Main {public static void main(String[] args) {int n = 12013;System.out.println(fun(n));}private static int fun(int n) {int mCurrent = 0;int mUp = 0;int mDown = 0;int j = 1;int count = 0;while (n / j != 0) {mCurrent = n / j % 10;mUp = n / (10 * j);mDown = n - (n / j) * j;switch (mCurrent) {case 0:count += mUp * j;break;case 1:count += mUp * j + mDown + 1;break;default:count += (mUp + 1) * j;break;}j *= 10;System.out.println(count);}return count;}}


对于满足N=f(N)的最大N是多少。

我们如下分析:

当N<=9时,1有1个;

当N<=99时,1有20个;

当N<=999时,1有300个;

可以得出公式:f(10^n-1)=n*10^(n-1)

可以发现当n>=10时,f(10^n-1)<n*10^(n-1),当n<=9时,f(10^n-1)>n*10^(n-1)。

在10^9-1<N<10^10-1之间,可能存在N=f(N)。

最后得到N=1111111110时,成立。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肩膀和后背受风怎么办 手指关节杵肿了怎么办 骨关节退行性变怎么办 疼风脚趾肿了怎么办 痛风脚右侧肿了怎么办 痛风引起的脚肿怎么办 老人腰闪了该怎么办 腰闪了站不起来怎么办 又怕冷又爱上火怎么办 肝上多发小囊肿怎么办 5岁宝宝咳嗽厉害怎么办 5岁宝宝咳嗽有痰怎么办 生川乌外贴中毒怎么办 7个月宝宝流鼻涕怎么办 脸上皮肤毛孔粗大有黑头怎么办 嗓子长了个囊肿怎么办 食管胃粘膜异位怎么办 狗狗肿瘤破了怎么办 婴儿胃食道反流怎么办 小儿胃食道反流怎么办 放疗后咳嗽痰多怎么办 胃息肉是恶性的怎么办 老是胃疼,胃胀怎么办 吃完饭之后胃胀怎么办 胃痛胃胀怎么办能缓解 胃胀不消化怎么办快速解决 便秘肛裂了好痛怎么办 胃消化慢还便秘怎么办 11个月婴儿便秘怎么办 80多岁老人便秘怎么办 狗狗便秘拉不出来怎么办 2个月幼犬便秘怎么办 狗狗便秘怎么办吃什么 痔疮又痛又痒怎么办 痔疮肉球特别痒怎么办 长了个小痔疮怎么办 产后4天没大便怎么办 7个月孕妇痔疮怎么办 运动完恶心想吐怎么办 跑步后恶心想吐怎么办 肠子不蠕动严重便秘怎么办