数字的反转数:一个数,将其首尾倒置。例如4321的反转数便是1234。

  编写一个程序,接受两个数字,并输出他们的反转数的和的反转数。例如,24和1。那么结果就是42+1->43->34

  注意,数字反转以后,数字的最前面和最后面不可能出现0!那么在先处理两个数相加的结果时,应该将最后方的0删除掉!

  如何避免多次的数字反转操作呢?可以参考自定义大数相加的算法!将数字按位相加,进行进位操作等!

  但是这里应该把两个数高位对齐再相加,相加时,从最高位加到最低位,并向低位进位,因为最后要反转过来!例如:1234与891的反转和,4321+198->4519->9154。表示为1234+8910->1+8, 2+9, 3+1+1, 4+0->9154。只需要一次的反转操作!

Read the rest of this entry

, ,

  一个正整数的数字根是通过计算该整数的各位的和产生的。如果一个整数的个位和是一位整数,那么这个数字就是该整数的数字根。如果该整数的各位和是两位或多位整数,那么,就需要重复计算各位的和,直到获得一位整数。

  例如,考虑正整数 24。把 2 与 4 相加得到 6。由于 6 是一个一位整数,所以,6 就是24 的数字根。现在再来考虑正整数 39。3 与 9 相加等于 12。因为 12 不是一位整数,因而,需要重复处理。再把 1 加 2 得到 3,现在 3 已是一个一位整数了,那么 3 就是 39 的数字根。

Read the rest of this entry

, ,

  编写一个程序,读入一个正整数,把所有的连续的,和与给定的正整数相等的正整数们找出来。例如,如果输入为27,于是发现2+3+4+5+6+7,8+9+10,13+14为27,那么共有3个组合。如果输入的数字是10000,那么就有18加到142,297加到1328,388加到412以及1998加到2002这4组。

  通常的算法是,将所有小于n/2的连续正整数的和的情况算出来与n比较。

Read the rest of this entry

, , ,

  Fibonacci数列是指1, 1, 2, 3, 5, 8, 13, 21, 34, ····这样的数列。用式子描述即f1, f2, fn, f1=1, f2=1, 其后fn=fn-1+fn-2。

  现在考虑,如何写一个程序,接受参数n,返回第n个fibonacci数值呢?

  通常的办法是用递归:即从n开始,依次调用自身求出f(n-1)和f(n-2)。代码如下:

Read the rest of this entry

, , ,

  如果n与m是整数,那么m^n就是求m的n此方,即把m连乘n次!
  用算法描述起来很简单!在n次循环内不断自乘m,或者递归调用n次乘法即可,但是这极其没有效率!

  其实,可以将指数运算分解。注意到x^4可以由x^2自乘得到。

  思路:当求m的n次方时,n可能是2k(偶数),可能是2k+1(奇数),可能是0(不需要乘).那么在计算m^n时,可以分成3部分进行递归。第一部分:n为0,不用计算。第2部分:n是偶数,递归计算m的n/2次方。第三部分:n是奇数,即表示为n=2k+1,那么递归调用计算m的n/2次方,再自乘m即可。

Read the rest of this entry

, , ,

  根据算数基本定理,任何一个整数n>1都可以表示为素数的乘积,切在不考虑顺序的情况下,该表达式是唯一的!即n=p1·p2·····pn。

  写一个程序,读入一个正整数,把它的所有质因子找出来。例如,输入是72,72=2³·3²。质因数有2和3,为方便起见,将输出写成因数(指数)的形式!如输入72,则输出为2(3)3(2)。

  思路:用质数依次去除n,从2开始一直到除不尽为止。如果除了i次,那么有2(i)。同样的道理3,5,7,···也按同样的办法处理!每一次除不尽时的余数,作为下次的被除数!

  代码如下:

Read the rest of this entry

, , ,

  在用“筛法”求素数时,每次筛除素数的动作,其实有很多是重复的!比如,如果一个数是3*5*7*9,那么删除的时候,它会被作为3的倍数,5的倍数,7的倍数,9的倍数,被重复判断删除4次。类似的,较大的数有较多的因数,那么,删除它所耗费的时间会很多!如何来优化“筛法”的算法,使之不重复呢?

  思路如下:从2开始,先删除2²,2³,2³,···,接着删除2·3,2²·3,2³·3,···,而此时并不删除3。再删除2·5,2²·5,2³·5,···,接下来2·7,2²·7,2³·7,···。一般而言,当发现p是一个素数时,先删除p²,p³,p³,···这一系列合数。因为p是素数,所以p²,p³,p³,···不可能被其它数整除。接着,找出比p大,但是第一个没有被删除的数q。再删除p·q,p²·q,p³·q,···。因为p是素数,q为目前为止未删除。所以p^¡·q之前也没有被删除。

Read the rest of this entry

, , ,

  如果整数 n ≠ 0,±1。如果除了显然因数 ±1 和 ±n 以外,n没有其他因数,那么 n 叫做素数。如:2,3,5,7是素数,4,6,10,15是合数。

  根据素数的性质,有这样的定理:1、设 n 是一个正合数,p 是 n 的一个大于1的最小正因数,则 p 一定是素数。2、设 n 是一个正整数,如果对所有的素数 p ≤ √n,都有 p 不整除 n,则 n 一定是素数。

  根据两条定理,可以得到寻找素数的群定性方法,通常叫做 埃拉托斯散筛法。
  筛法具体描述如下:对于任意给定的整数 N ,要求出所有不超过 N 的素数。列出 N 个整数,从中删除小于等于√n的所有素数p1, …, pk的倍数。然后依次删除余下的整数(不包括1)就是所要求的不超过 N 的素数。
  如果让你用筛法求出 2 到 某个数 之间的所有素数,如何用代码实现呢?

  思路:用一个数组x[0], x[1], …来存储3,5,7,11…這些奇数,因此,x[i]中所有存储的数就是2i+3。将所有元素初始状态设置为未筛除,然后依次去掉其中的合数。

  现在考虑如何删除合数。从x[0],x[1]…如果x[i]未被筛出,则其为质数,删除其所有倍数,依次往下走。但x[i]中储存的值是2i+3,而2i+3的倍数在数组中的什么地方呢?因为数组中全部是奇数,所以2i+3的倍数可以表示为(2n+1)(2i+3),根据(2n+1)(2i+3) = 2n(2i+3)+2i+3 = 2[n(2i+3)+i]+3,知道x[i]对应的数(即2i+3)的倍数的位置为n(2i+3)+i。当n=1是,值为(2i+3)+i,当n=2时,值为(2i+3)+i+(2i+3), 依次类推,用(2i+3)+i作为初值,删掉对应的x[],再加上2i+3,删掉对应的数,直到无数可删。因为最后的一个素数可以表示为2N+3,所以筛法求出的为2到N之间的素数。
  代码如下:

Read the rest of this entry

, , ,
Navigation »