zoukankan      html  css  js  c++  java
  • 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");
    }

  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5150817.html
Copyright © 2011-2022 走看看