阿哈磊的挑战7-10

xiaoxiao2021-02-28  76

第七个问题是求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; }
转载请注明原文地址: https://www.6miu.com/read-80279.html

最新回复(0)