阿哈磊的挑战7-10

第七个问题是求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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值