`
jeho0815
  • 浏览: 25609 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

一个算法问题

阅读更多
今天上午上班由于没什么事做,就看看书,发现一个算法问题,开始看感觉貌似很简单,但是越想越有意思。
1,题目描述:
    给定一个十进制的正整数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;
    问题是:
    1,写一个函数f(N),返回1到N之间出现的1的个数,比如f(12) = 5.
    2,在32位证书范围内,满足条件“f(N) = N”的最大的N是多少?
一开始我看到这个问题,第一反应就是递归,感觉只要解决两个问题就可以了,一是算出N含有的1的个数,再根据f(N-1)就能得到f(N)的值。其中f(1) = 1 ;这是一个最简单的递归方法。写出的代码如下:
public class Jeho1 {

public static int count1(int n){
if(n == 1 ) return 1;
else return count1(n-1)+Count1InOne(n);
}

public static int Count1InOne(int m){
int count = 0 ;
String temp = new Integer(m).toString();
for(int i = 0 ; i < temp.length() ; i ++){
if(temp.charAt(i) == '1') count++;
}
return count;
}
/**
* @param args
*/
public static void main(String[] args) {
// for(int i = 1 ; i <= 99 ; i++){
// if(i == count1(i))
// System.out.println(i);
// }
System.out.println(count1(33));
}

}
刚开始我输入几个比较小点的数,发现算的都很正常,但是到了10k的时候就不行了,一看傻13了,栈溢出了。。。确实,这样递归看样子是不可能实现大数据计算的。没办法,只有继续看书寻求更好的方法。承认自己数学没有学好,看到这样的东西都不会望数据本身想,而总是想利用那些最基本的算法来实现。
书上的算法写的好复杂,简单来讲就是先从数字本来来找规律,数字的个位十位百位分开来看。由于被pdf加密,不能复制,所以自己就不太好来讲了,貌似可以上传附件,大家可以自己打开看看,这个是我按照它算法描述写的,果然计算结果就是不一样。代码献上先:
public class Jeho {

public static int count1(int n){
int count = 0 ;
int facror = 1;
int lowerNum = 0;
int currNum = 0 ;

int higherNum = 0;

while(n/facror != 0){
lowerNum = n - (n / facror) * facror;
currNum = (n / facror) % 10;
higherNum = n / (facror * 10);

switch(currNum){
case 0:
count += higherNum * facror;
break;
case 1:
count += higherNum * facror + lowerNum +1;
break;
default:
count += (higherNum + 1) * facror;
break;

}
facror *= 10;
}
return count;
}
/**
* @param args
*/
public static void main(String[] args) {
int count = 0 ;
System.out.println(Integer.MAX_VALUE);
// System.out.println(count1(100000000));
for(int i = 1 ; i < 10000000 ; i++){
if(i == count1(i)){
count++;
}
}
System.out.println(count);
}
测试了下,输出一个结果超快,哎,自己脑子还是很不够用啊,得多多学习。
分享到:
评论

相关推荐

    算法问题实战策略 高清【带详细目录】PDF

    《算法问题实战策略》这本书是2015年2月出版的,主要涵盖了算法分析、设计、实战应用等多个方面的内容,对于想要深入理解和提升算法能力的读者来说是一份宝贵的资源。书中通过详细的目录结构,将内容划分为六个部分...

    动态规划,分治算法,概率算法,模拟退火算法,搜索算法,贪婪算法,网上matlab,遗传算法,组合算法

    2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...

    算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码.zip

    算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业...

    贪婪算法和最小路径算法解决TSP问题matlab源代码

    城市旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问一个旅行商如何访问n个城市,每个城市仅访问一次,并返回起点,使得总旅行距离最短。这个问题是NP完全问题,没有已知的...

    用遗传算法和动态规划来求解经典算法问题-TSP商旅问题_Pytho源代码

    经典算法问题-TSP商旅问题(Traveling Salesman Problem),它是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的...

    经典问题算法解法汇总

    "最优分解问题参考答案.cpp"可能涉及到的是如何将一个大问题分解成若干个小问题,然后找到最优的组合。这可能是贪心算法、动态规划或者分治策略的实例。这些方法经常用于解决最优化问题,例如最小生成树问题(如Prim...

    用贪心算法解单源最短路径问题

    贪心算法解决单源最短路径问题的基本思想是分步求出最短路径,每一步产生一个到达新目的顶点的最短路径。下一步所能达到的目的顶点通过贪婪准则选取,即选择路径最短的目的顶点。设置顶点集合S,并不断作贪心选择来...

    matlab 遗传算法 一维下料问题

    1. **初始化种群**:随机生成一定数量的个体,每个个体表示一种可能的切割方案,长度表示材料的总长度,每个切割位置可以看作一个基因位点。 2. **计算适应度**:根据一维下料问题的需求,设计适应度函数。例如,...

    输油管道问题算法源程序

    这些问题往往可以通过数学建模转化为算法问题,进而用编程来求解。 接下来,让我们深入探讨分治算法。分治是一种重要的算法思想,它的基本策略是将一个大问题分解为若干个规模较小的相同或相似的子问题,然后分别...

    求解指派问题的JV算法

    JV算法,全称是Jonker-Volgenant算法,是求解指派问题的一个高效算法。该算法是由C.J.M. Jonker和A.C.M. Volgenant在1987年提出,专门针对完全对称的指派问题设计。相较于经典的Kuhn-Munkres(KM,也称为匈牙利)...

    用遗传算法求解最短路径问题

    此外,遗传算法求解最短路径问题的一个关键处理方法是保持种群的多样性,避免过早收敛到局部最优解。为了实现这一点,可以使用多种策略,比如精英选择、多点交叉和自适应变异等。精英选择是保留一定数量的最优秀个体...

    遗传算法解决车间调度问题

    在实际生产中,JSP并不总是要求得到精确解,因此有研究者使用近似算法在适当的时间内得到一个可接受的近似最优解来求解此问题,实际的计算表明,好的近似算法通常能在可接受的时间内得到与精确解相差甚小的近似解,...

    各种优化算法解决TSP问题

    TSP是一个经典的组合优化问题,目标是找到一个最短的路径,使得旅行商能够访问给定城市列表中的每一个城市一次并返回起点。这个问题具有NP完全性,意味着在多项式时间内找到最优解是非常困难的。 描述中提到的智能...

    遗传算法和蚂蚁算法求解TSP(旅行商问题)实验报告(内含部分源代码)

    遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即...

    matlab遗传算法求解选址问题

    在IT领域,优化问题是一个广泛研究的...总之,MATLAB提供了一个强大的平台来实现遗传算法,解决选址问题。通过理解遗传算法的基本概念和MATLAB编程,我们可以灵活地设计和优化算法,以找到复杂优化问题的近似最优解。

    用A*算法解决TSP问题

    TSP是一个著名的NP完全问题,其目标是在一个加权完全图中找到一条经过每个顶点一次且返回起点的最短闭合路径。在实际应用中,TSP广泛出现在物流配送、电路板布线等领域。由于问题的复杂性,通常采用启发式算法或近似...

    网络优化问题的近似算法

    网络优化问题的近似算法:网络优化问题在计算机科学和运筹学中是一个关键的研究领域,特别是在设计有效的算法以解决大规模网络中的问题时。近似算法作为解决优化问题的一种有效手段,能够在多项式时间内给出问题的...

    tsp问题贪心算法求解

    这是一个著名的NP完全问题,意味着没有已知的多项式时间算法可以解决所有规模的实例。 **C程序实现** 在提供的文件列表中,`tsp.c`很可能是旅行商问题的C语言实现。C语言是一种通用的、面向过程的编程语言,适用于...

    遗传算法、禁忌搜索、模拟退火、蚁群算法 解决三十个城市的旅行商问题python实现

    在优化问题领域,旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,它涉及到寻找最短的可能路线,使得一个旅行商能够访问每个城市一次并返回起点。这个问题是NP完全的,意味着没有已知的...

Global site tag (gtag.js) - Google Analytics