随笔分类 - NOI OpenJudge
摘要:思路 汉诺塔是递归思想最经典的例子,通过递归不断缩小问题,将n个盘子的问题简化n 1个,直至1个。 三个盘子,分别为A:from,B:to,C:by(A为起点盘,B为目标盘,C为中转盘) 过程 1. 将1~n 1号盘子从A移动到C,借助B,递归进行 2. 将第n号盘子从A移动到B 3. 将1~n 1
阅读全文
摘要:思路 很容易看出规律,一个运算符出现,其后就一定需要左值和右值,而左值和右值有可能还是运算符,这就需要继续递归。递归终止的条件就是遇到数字。 逆波兰表达式其实是构造成了一颗二叉树 例程 include include //atof函数用于将以字符数组形式 //存在的浮点数转化为浮点数 //cstdl
阅读全文
摘要:思路 可以把任意一个数转化为 2^a+2^b+2^c+...+2^n 例如137的二进制为 10001001 ,这就等效于 2^7+2^3+2^0 以上结果如何通过程序循环处理呢?需要把数字n分解为上述公式,对指数(a,b,...n)依次进行递归 要对整个结果进行递归生成字符串组后一次性输出比较麻烦
阅读全文
摘要:整体思路 这是一个典型的递归型问题: 1. 临界点:如果只有1级台阶,有1种走法(一次一步);如果有2级台阶,则有2种走法(一次一步或一次两步) 2. 递归方法,对于n级台阶,如果第一次走1步,还剩n 1级台阶,n 1级台阶的走法有 f(n 1) 步,如果第一次走2步,还剩n 2级台阶,n 1级台阶
阅读全文
摘要:整体思路 对于任意的p,q,r,可能使得p q=r的最小进制应该是p,q,r三个数的所有数位中最大的数字+1,例如,6,9,42三个数中所有数位中最大的数字是9,故可能成立的最小进制是9+1,即10。题目告诉我们,最大进制B using namespace std; int p, q, r; //定
阅读全文
摘要:整体思路 本题如果使用scanf每次读入一个单词、比对替换后再进行输出的话就十分简单,使用这种方法必须要用数组把读入的所有单词存起来,读入的count个单词的前n 2个是原文,第n 1个是查找的单词,第n个是替换值。 如果要求设计一个函数 replace(原文,被替换单词,替换值) ,这就稍有些难度
阅读全文
摘要:整体思路 这里需要大量使用素数,必须能够想到 只求出M到N之间的素数是不够的 ,因为M到N之间数字的反序有可能是大于M或小于N的数字,例如M=2,N=20,那么19的反序91大于20,所以使用 埃拉拖色尼 算法计算素数表的时候要让范围尽可能大,根据题目要求,设计为1~100000。 本题也可以尝试不
阅读全文
摘要:整体思路 使用 埃拉拖色尼 算法提前计算出1000以内的素数表。 设计一个回文判断函数isHW(int n),难点在于数字回文的判断。一个简单的方法是将数字n使用 sprintf 输出在一个数组中,然后从数组的头和尾开始进行逐一对比。 著名金融家“索罗斯”的名字“SOROS”就是一个回文字串。 例程
阅读全文
摘要:整体思路 本题涉及大量素数的使用,故使用 埃拉拖色尼 算法提前计算出素数表可以避免大量、重复的计算。 判断素数对很简单,使用两个变量p1和p2代表素数表中的第一个和第二个素数,依次在表中向后移动,判断p2 p1是否等于2即可。 例程 include include using namespace s
阅读全文

浙公网安备 33010602011771号