今天上午上班由于没什么事做,就看看书,发现一个算法问题,开始看感觉貌似很简单,但是越想越有意思。
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);
}
测试了下,输出一个结果超快,哎,自己脑子还是很不够用啊,得多多学习。
分享到:
相关推荐
也就是说,如果一个问题的最优解包含子问题的最优解,那么贪心算法才可能适用于这个问题。对于最优合并问题,可能需要分析合并操作是否满足这个性质,并进行相应的证明。 在实际应用中,贪心算法的性能可以通过时间...
2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...
算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业:股票买卖最佳时期系列问题 南开大学 算法导论源码算法导论大作业...
城市旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问一个旅行商如何访问n个城市,每个城市仅访问一次,并返回起点,使得总旅行距离最短。这个问题是NP完全问题,没有已知的...
这是一个著名的NP完全问题,意味着没有已知的多项式时间算法可以解决所有规模的实例。 **C程序实现** 在提供的文件列表中,`tsp.c`很可能是旅行商问题的C语言实现。C语言是一种通用的、面向过程的编程语言,适用于...
"最优分解问题参考答案.cpp"可能涉及到的是如何将一个大问题分解成若干个小问题,然后找到最优的组合。这可能是贪心算法、动态规划或者分治策略的实例。这些方法经常用于解决最优化问题,例如最小生成树问题(如Prim...
贪心算法解决单源最短路径问题的基本思想是分步求出最短路径,每一步产生一个到达新目的顶点的最短路径。下一步所能达到的目的顶点通过贪婪准则选取,即选择路径最短的目的顶点。设置顶点集合S,并不断作贪心选择来...
旅行商问题是一个经典的组合优化问题,描述的是一个旅行商如何在访问n个城市后返回起始城市,使得总行程距离最短。这个问题属于NP完全问题,没有已知的多项式时间解决方案,因此常采用近似算法或启发式方法求解,...
1. **初始化种群**:随机生成一定数量的个体,每个个体表示一种可能的切割方案,长度表示材料的总长度,每个切割位置可以看作一个基因位点。 2. **计算适应度**:根据一维下料问题的需求,设计适应度函数。例如,...
这是一个典型的排列组合问题,要求在8×8的格子中填写数字,且相邻格子的数字不能连续。 **解决方案**: 可以采用回溯法来解决。通过递归地尝试在格子中填写数字,并检查是否满足题目条件。 --- #### 题目14:在4...
JV算法,全称是Jonker-Volgenant算法,是求解指派问题的一个高效算法。该算法是由C.J.M. Jonker和A.C.M. Volgenant在1987年提出,专门针对完全对称的指派问题设计。相较于经典的Kuhn-Munkres(KM,也称为匈牙利)...
旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,其核心在于寻找一条访问给定城市并返回起点的最短路径,使得每个城市仅被访问一次。这个问题的复杂度随着城市数量的增加呈指数级增长...
在实际生产中,JSP并不总是要求得到精确解,因此有研究者使用近似算法在适当的时间内得到一个可接受的近似最优解来求解此问题,实际的计算表明,好的近似算法通常能在可接受的时间内得到与精确解相差甚小的近似解,...
此外,遗传算法求解最短路径问题的一个关键处理方法是保持种群的多样性,避免过早收敛到局部最优解。为了实现这一点,可以使用多种策略,比如精英选择、多点交叉和自适应变异等。精英选择是保留一定数量的最优秀个体...
TSP是一个经典的组合优化问题,目标是找到一个最短的路径,使得旅行商能够访问给定城市列表中的每一个城市一次并返回起点。这个问题具有NP完全性,意味着在多项式时间内找到最优解是非常困难的。 描述中提到的智能...
例如,该代码可能针对一个具体的问题场景,通过一个具体的算法解决了工作分配问题。这可能意味着代码涉及到了算法的细节设计、任务与资源的匹配逻辑、数据结构的选择和算法优化等多个方面。 对于工作分配问题的解法...
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即...
TSP是一个著名的NP完全问题,其目标是在一个加权完全图中找到一条经过每个顶点一次且返回起点的最短闭合路径。在实际应用中,TSP广泛出现在物流配送、电路板布线等领域。由于问题的复杂性,通常采用启发式算法或近似...