第七个问题是求987654321的最大质因数
*最开始我是想调用判断素数的函数来做,如果他的因数是素数,就把他存放起来,然后和前一个质因数比较,留下较大大的。
# include "stdio.h"
isSuShu(int n)
{
int i;
for (i==2; i<=sqrt(n); i++)
{
if (n/i == 0) return false;
}
return true;
}
int main(void){
int n=987654321;
int i; k=0;
for (i =2; i<=n; i++)
{
if(n/i == 0 &&isSuShu)
{
if (i>k) k = i;
else continue;
}
}
printf("%d", k);
}
后来发现这样的效率并不高,然后尝试把for (i =2; i<=n; i++)换成for (i =2; i<=sqrt(n); i++)试试,那么k就不是i了;而是n/i.算是节省了一部分效率吧。
后来看了一下别人的代码,贴出如下:
# include "stdio.h"
int main()
{
int n = 987654321;
int i;
while (n >1){
printf("#%d#\n", n);
for(i=2;i<=n;i++){
if (n==i){//到达n了,就没有继续的必要了,已经最大
printf("%d", n);
}
if(n%i==0){//
n = n/i;
break;
}
}
}
return 0;
}
网上找到的这种算法,效率上并没有多高,但是是一种新的思路。
第八道题是求100–200之间的孪生质数
代码如下:
//相差为2的两个质数称为孪生质数。例如3和5是一对孪生质数,
//41和43也是一对孪生质数。那么100~200之间共有多少对孪生质数呢
# include "stdio.h"
# include "math.h"
int isSuShu(int n)
{
int i, k=0;
for(i=2; i<=sqrt(n);i++)
{
if (n%i==0)
return false;
}
return true;
}
int main()
{
int i, j=2, c=0;
for (i=100;i<200;i++)
{
if (isSuShu(i))
{
printf("%d\n", i);
if(i-j==2)
{
j=i;
c++;
}
else
j=i;
}
}
printf("#%d#\n", c); //孪生素数个数
return 0;
}
第九道题是 猴子摘桃问题
我用的是递归调用的方法,本质上就是循环。
/*
* 某一天早晨,有一个猴子摘下了若干个桃子,当即就吃了一半,还不过瘾,又多吃了一个。
* 第二天又将剩下的桃子吃了一半多一个。以后每天早上都吃了前一天剩下的一半多一个。
* 到第10天的时候再想吃的时,发现只剩下一个桃子了。
* 这个贪吃的猴子第一天究竟摘了多少个桃子呢
*/
# include "stdio.h"
isPeach(int i, int k)
{
k--;
if (k==0)
return i;
else
{
printf("%d\n", (i+1)*2);
return isPeach((i+1)*2, k);
}
}
int main()
{
int i;
i = isPeach(1,10);
printf("%d", i);
return 0;
}
第十道题是 小明爬楼梯问题
这个也是用的递归。
小明怕到第36层的时候有三种状态,他在第35层,或者第34层,或者第33层,那么小明爬到第36层的爬发就是爬到第35/34/33楼层爬发之和,,以此类推。
//可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,
//有的时候一次爬两个台阶,有的时候一次爬三个台阶。
//如果这个楼梯有36个台阶,小明一共有多少种爬法呢
# include "stdio.h"
int Stairs(int n)
{
switch(n)
{
case 1: return 1;
case 2: return 2;
case 3: return 4;
default:
return Stairs(n-1)+Stairs(n-2)+Stairs(n-3);
}
}
int main ()
{
printf("%d\n", Stairs(36));
return 0;
}