欧拉计划总结(5)

Hello,各位好啊,最近这几天快考试了,所以大部分时间都在为考试而奋斗(归咎到底还是因为平时没认真听课啊,5555 o(>﹏<)o )。不过本来昨天就得把心得解决了,可是舍友生日,晚上聚餐,吃完饭后,大家又去唱歌,唱到12点多。哎呦累哦,然后又睡不着,又没心思写,真是太难受了。所以就把心得推到今天解决。废话不多说了,下面是41到50的算法思路。

  • problem 41求最大的n位pandigital质数。对这道题目,我先想到的是用递归。设计一个判断质数的子函数跟,交换值的子函数。主函数里我循环8次这个递归函数,而对于这个递归函数,我先判断数组是不是已经到最后一位了,因为我主函数是从8开始,所以第一次数组里代表的数值就有8个,以此类推。如果到最后一位,那就先把数组里的数值转化成整形,在判断这个整形是不是质数且是不是最大,是就把这个数值赋值给answer,不是就继续递归。如果还不是到最后一位,那就用for语句从当前这一位循环到最后一位,先对当前这位数组元素跟对应i的数组元素交换,然后在递归,递归完后再交换回来。最后得出最大质数。
  • problem 42求该文件内的英文词列表有多少个三角数。这道题不会很难,只要把单词提取出来,然后算出对应的数值num,在用个for语句嵌套循环,判断i*(i+1)/2是不是等于num,是的话,answer就+1,不是就继续循环,最后解得answer。
  • problem 43找出所有异常子串整除性的pandigital数之和。这道题目跟41题的解题思路差不多,只是我主函数中我没弄循环,因为题目要求只要9位,所以我就只弄了一次9位的递归。这个递归里面还是判断是不是到第9位了,不是的话for语句i = m循环,交换当前位m的数组元素与i对应的数组元素,在递归,递归完后再把数值交换回来,恢复数组。如果是最后一位了,调用判断这个数组是不是有题目要求的能被质数整除的特性,有的话,将数组转换成整形,answer = answer+这个整形,最后求出答案。
  • problem 44找出和与差都是五角数的五角数对。我先从i=1循环到一定数量的值,将i*(3*i-1)/2赋值到p[i]中,然后for循环i = 1,在一个for循环j=i+1,都只循环到p数组的一半,调用判断p[i]+p[j]和p[j]-p[i]是不是五角数,这里用到了个新函数bsearch,二分法搜索,其实也就是用这个函数,也新建一个比较函数,用来当bsearch的函数指针,搜索p[i]+p[j]和p[j]-p[i]是不是都在p数组里,是的话,且找出最小,赋值给answer,得出答案。
  • problem 45求40755之后即是五角数又是六角数的三角数。这道题目我只能说我用公式带,以前学的一元二次方程组这时候就可以派上用场啦。我从六角数h=144开始无限循环,answer = h*(2*h-1),调用判断是否是五角数跟三角数,是的话跳出,输出answer。这里说下怎么判断。主要是求解的方式,不是有个公式是(-b正负sqrt(b的平方-4ac))/2a,就通过这个,根据题意,公式变成(-b+sqrt(b的平方-4ac))/2a,求出这个解,在判断下是不是整数,是的话那输出true不是的话就false,同理,五角数也是这么求解的。
  • problem 46最小的不能写作一个质数与一个平方数的二倍之和的奇合数是多少。用两个整形数组prime和composite分别表示质数和奇合数,两个for嵌套循环质数数组和奇合数数组,临时整形temp表示(当前奇合数-质数)/2后开方取整,在判断,temp*temp*2 == 当前奇合数-质数,是的话,answer = 当前奇合数,跳出所以循环,得出答案。
  • problem 47找出最小的四个具有四个不同质数因子的整数。先设计一个子函数FourPrimes,判断该数值是不是有4个质因子,然后主函数中,从1000开始无限循环,调用FourPrimes判断是不是有4个质因子,有的话c++,没有的话c=0,在判断c是不是等于4,是的话,answer等于当前循环到的数值-3,跳出循环,输出答案。
  • problem 48算出1^1+2^2+3^3.....1000^1000的最后10位数。其实也就是大数相乘再相加的问题,不过题目只求最后10位,所以只要判断最后10位就行了。我用一个只有3个整形的整形数组来表示最后十位,主函数从1到1000,调用series,求出当前值次方的最后10,调用sum是为了为了求出2个数组对应元素的和,且每个整形都不超过10000。求到最后,num对应的第三个数组元素得%100,再赋值给该元素。由于求出的10位是反过来的,所以得从第三个数组元素开始输出。得出答案。
  • problem 49找出互为排列的4位数质数组成的序列。一个prime子函数判断是否为质数(感觉我好像经常用个的说 ⊙﹏⊙b)。check判断每个四位数数是不是都是其他数字的一种排列。主函数中,从1488开始循环到1000-6660,然后在循环,判断当前数值+3330和+6660后的数值是不是都为质数,是的话,调用check,判断这3个每个四位数数是不是都是其他数字的一种排列。是的话answer=当前值,输出answer,answer+3330,answer+6660。得出答案。
  • problem 50100W以下,哪个质数能写成最多连续质数之和。还是一个判断是不是质数的子函数isprime。prime数组求出小于100W的所以质数。for从i=0循环到prime数组元素个数,anstemp = 0, count = 0,再for从k=i到anstemp <100W,anstemp=anstemp +prim[k]count++,循环结束后,anstemp = anstemp -prime[k-1],判断count是不是最大的且anstemp 是不是为质数,都满足的话answer = anstemp ,直到循环结束,输出答案。

终于写好了,松了一口气的说。上次,我不是说有去听一个讲座吗,结果我的舍友就打算去报名参加培训,不过培训费N贵的,晕死。不过看他们那么热情满满,我也希望他们能真正得到锻炼,学到很多有用的东西,这里先祝福他们旗开得胜,凯旋而归。呵呵,不过今天的euler我还没更新的,等下一并发上来。

你可能感兴趣的:(欧拉心得总结)