C语言 百炼成钢7

//题目19:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

//分析:首先必须求出该数所有的因子

//方法1(不推荐)
void maina(){
    int arr[1000][30] = {0};
    int arr2[1000] = { 0 };
    int index = 0;
    int index2 = 0;
    int temp = 0;
    int temp2 = 0;
    for (int j = 3; j < 1000; j++)
    {
        temp = 0;
        temp2 = 0;
        index = 0;
        //计算出该数所有的因数
        for (int i = 1; i < j; i++)
        {
            if (j%i == 0)
            {
                arr[j][index] = i;
                index++;
            }
        }
        
        if (arr[j][1] != 0)
        {
            while (arr[j][temp] != 0){
                temp2 += arr[j][temp];
                temp++;
            }
            if (temp2 == j)
            {
                arr2[index2] = j;
                index2++;
            }
        }
    }
    for (int k = 0; k < index2; k++)
    {
        printf("
%d", arr2[k]);
    }
    system("pause");
}

//方法2
void main(){
    //int k[50] = { 0 };
    int s=0,n=0;
    for (int i = 1; i < 1000; i++)
    {
        s = i;
        n = 0;
        for (int j = 1; j < i; j++)
        {
            if (i%j==0)
            {
                //用这个数不断的减去因子
                s = s - j;
            }
        }
        //证明是完数
        if (s==0)
        {
            printf("
完数是%d",i);
        }
    }
    system("pause");
}

//题目20:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
//第10次落地时,共经过多少米?第10次反弹多高?

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

//分析:1--100,2--50,3--25,4--12.5...,就是每次的高度是上次的1/2,即f(n)=0.5*f(n-1);
//这种由前面的值决定后面值的办法,可以使用递归
//第一次落地,经过100米,第二次经过f(1)+f(2)
//第十次落地就是前9次相加之和

double run(int n){
    if (n==1)
    {
        return 100.0;
    }
    else{
        return 0.5*run(n - 1);
    }
}


void main(){
    int n = 10;
    double sun = 0.0;
    for (int i = 0; i <10; i++)
    {
        if (i==0)
        {
            //第一次只有上没有下,所以经过的是100米
            sun = 100.0;
        }
        else{
            //第二次会先跳上去,再跳下来
            sun += 2*run(i + 1);
        }
        
    }
    printf("第10次落地时,共经过%lf米,第10次反弹%lf米",sun,run(11));

    system("pause");
}

//题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
//第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
//的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

//分析:该题也是前一天,后一天的问题,可以考虑使用递归
//第一天剩下的桃子为f(1);那么第二天剩下的桃子数目就是f(2)=f(1)*0.5-1,即f(1)=2*(f(2)+1);第三天f(2)=2*(f(3)+1);
//由此可知:f(9)=2*(f(10)+1);

int run(int n){
    if (n==10)
    {
        return 1;
    }
    else{
        return 2 * (run(n+1) + 1);
    }
}

void main(){
    printf("第一天共摘了%d桃子
", run(1));

    system("pause");
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5150817.html