欧拉计划总结(4)

转眼又过去10题了,已经是第40题了。做到现在感慨真的挺多的。像我现在做很多类似的题目都会很固定的想到自己以前定义的一些算法,例如:要求质数,我就会定义一个布尔子函数,引入这个值的参数,然后去确定这个值是不是质数,是的话输出true,不是就是输出false。呵呵,有点感觉自己的思维是不是已经有向固定化模式转变的趋势了。 不过,不管怎么样,说到底,我还是很喜欢做算法题目。
前些天参加了个讲座,这个讲座是一个从日本回国在IT行业有9年经验的专家——周某(为了避免广告嫌疑,以下用周某代称)开的一个名为“IT行业未来10年”的讲座。讲座内容说真的除了他阐述他参与开发的几个系统的一些事情和他播放他在某教育机构开课讲述一些资费课程的视频之外,其余的我都没神马印象o(╯□╰)o。这并不是说他讲得不好,而是他在讲到后面的时候大部分都是讲一些数据,而且讲到最后我还是听不懂他讲那些数据是要说明什么,所以对此,我不是很感冒的说o(>﹏<)o。不过,听他讲述他参与的开发项目还是很有意思的。至少他让我了解到,一个好项目的开发并不是只依靠自己独立完成的,而是要通过团队合作,互帮互助,最后达到目标。对于现在的我来说,一个好项目我能力是暂时不够,但是如果只是一个项目,我保证我绝对会尽最大努力去完成它,完善它。
言归正传,继续讲解我对这10题的一些思维。
  • problem 31这道题目是求硬币排列种类的次数的。看着不会很麻烦,用个递归算法就行了。其实我现在说得真么好听,当初这道题目没少杀死我几Y个脑细胞,毕竟我对递归不是很熟练。最后还是在走楼梯的时候突然灵光一闪想到的。主要还是way这个子函数定义,d代表的是数组里的第d个元素,即指的是硬币。l代表是减去后的值,即剩下能被分解的数。首先判断d是不是7,也就是是不是到值为1的硬币或者是l是不是等于0,是的话,次数answer+1,不是的话用一个for语句循环way的d+1和l-去当前a[d]*i,i从0开始循环,每次循环+1,且小于l/a[d]。最后输出answer。
  • problem 32找出所有能组成1到9pandigital的乘法算式中乘积的和。先确定下数值中乘积最大只能到多少,根据题目我们可以得知,乘积最大不超过10000,最小不会小于1000,所以循环j=9876到1234,再嵌套一个循环从i=2到j的开方。i如果不能整除j就继续循环,能的话,弄3个字符数组分别对应j,i,和j/i,一个检查数组check是为了判断3个值是不是都包含1到9的值,如果是的话answer += j,最后得出结果answer。
  • problem 33找出具有一种奇怪月份性质的所有分数。2个嵌套for循环从i=99到12,j=i-1到11,判断i的个位是不是等于j的十位,或相反,不是就继续循环,是的话,在具体判断是i的个位等于j的十位还是j的个位等于i的十位,a跟b等于i跟j去掉相同值后的个位数。tx,ty分别是i跟j的最大公约数跟a跟b的最大公约数。在判断j/i最简式是不是等于b/a的最简式,不是就继续循环,是的话就分别用ans1和ans2代表分母跟分子,循环完后求出ans1跟ans2的最大公约数,answer就等于ans1/这个最大公约数。
  • problem 34求所有等于各位数阶乘之和的数字之和。从i=3开始循环到1000000,t记录当前i值,循环for嵌套,求出的num代表当前i值的阶乘。在判断i是不是等于num,不是的话继续循环,是的话answer+=i。最后输出结果。
  • problem 35100W以下有几个循环质数。这道题目我就定义了两个子函数,一个是判断数组是是否为质数的prime函数,一个是数组左移的transmit函数。从i=2开始循环到100W,将i转化成字符串a当中,在从j=0循环a元素个数,判断数组a是否为质数,是的话就继续循环,不是的话跳出循环,判断这个数是不是循环质数,是的话answer++,不是就继续循环。得出结果。
  • problem 36100W以下10进制跟2进制都是回文数的数值之和。for循环i=0到100W,定义两个字符数组分别代表10进制后的字符串跟2进制后的字符串。调用判断10进制跟2进制是否为回文数的子函数palindromic,是的话answer+=i。最后得出结果。
  • problem 37找出11个可双向裁剪的质数之和。定义一个判断质数的子函数isprime跟一个两个字符串左右裁剪的子函数transmit。初始化bool数组s都为false,将所有下标为质数对于的s元素赋为true。次数count=0,for循环i=23,每次增加2,且次数count<11,R跟L代表裁剪后左边跟右边的值。len为还没裁剪的值的位数,for循环i=1到len,调用transmit,裁剪R跟L字符串,判断这两个字符串是否都是质数,如果其中一个不是,则跳出循环,如果都是,answer+=i。得出结果answer。
  • problem 38最大的能够通过一个固定数与1,2,3...相乘得到的1到9的pandigital数是多少。根据题意,得出这个值小于10000,所以,定义字符串num跟t和bool数组check,for循环i=1到10000,num跟t初始化为0,check所有元素都false,for嵌套j指的是连续数,所以从1开始,i*j转化为字符串t,循环整个字符串,且判断每个元素中没有'0'且对应的check为false,是的话当前check下标对应的t元素赋值为true,不是的话x值为false,跳出循环。在判断x是否为true,是的话count+=t的个数,且将t存入num字符串之后,不是就跳出。接下来判断count是不是为9,是的话在判断answer是不是<于num转换成整形的数值,是的话,answer=num转换成整形的数值,不是的话据需循环。最后得出结果answer。
  • problem 39p是直角三角形的周长,求1000以下p中哪个具有最多解。for循环p从5到1000,count = 0,for嵌套i=1到p-2,再for嵌套j=i到p-1,k等于p-i-j,判断k的平方是不是等于i的平方+j的平方,是的话count++,不是就继续循环。最后判断次数count是不是比max大,是的话就max = count,answer = p。最后求出解答answer。
  • problem 40解出无理数的小数部分的第n位之积。temp是指代第1,10,100..位,初始为1,for循环i=1到1000000,i转换为字符串s,t代表当前数的个位为第n位,len就是s的元素个数。如果t大于等于temp,answer *=(s[temp-t+len-1]-'0'),且temp*=10,不是的话继续循环,得出结果answer。
在这,我想到了讲座上周某说2个学习方法:看完书后做题目与定个目标,边做题目边看书。对于初学者来说,应该有挺多人都是先把整本书先啃完,然后在着手编程吧。呵呵,我以前也是。不过现在我大部分时间还是用第一种方法,偶尔自己也会用第二种方法,做个小项目什么的。现在我倒是很提倡用第二个方法,因为通过这个方法,可以学到许多书本上学不到的方法,能更加深自己对于语言的理解。对于那些真的想学点东西的人来说,这倒不失为一个好方法。
写到现在已经5月13号了,母亲节,在这先祝天下母亲,事事顺利,一生平安。也希望我母亲天天开心乐呵呵!O(∩_∩)O~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值