• 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");
    }

  • 相关阅读:
    mysql主从延迟判断,监控和问题处理
    oracle备份
    oracle的查询命令
    Appcan 自定义数字加减控件
    PowerDesigner16.5 有用地址
    git远程仓库关联(码云)
    leetcode27.移除元素(双指针法)
    leetcode26.删除排序数组中的重复项(双指针法,顺序表删除)
    leetcode21.合并两个有序链表(链表使用,递归算法)
    leetcode20.有效的括号(hashmap使用,键值匹配)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5150817.html
Copyright © 2020-2023  润新知