zoukankan      html  css  js  c++  java
  • C语言 百炼成钢16

    //题目46:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只
    //猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了
    //一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
    //问海滩上原来最少有多少个桃子?
    
    #include<stdio.h>
    #include<stdlib.h>
    
    //分析:最少有多少个桃子,说明是满足条件的最小数;假设有X个桃子,第一个猴子的桃子数量是(X-1)/5,
    //第二只猴子的数量是(第一个猴子的桃子数量的4倍-1)/5   即(4*f(1)-1)/5=f(2)====> f(1)=(5*f(2)+1)/4
    //f(n)=(5*f(n+1)+1)/4
    
    int i = 0;
    int t = 0;
    
    int Peach(int n){
        if (n == 5)
        {
            i++;
            return i;
        }
        else{
            t = 5 * Peach(n + 1) + 1;
            do{
                t = 5 * Peach(n + 1) + 1;
            } while (t % 4 != 0);
            //如果不是4的倍数 那么第n个猴子有的桃子数量不是整数,
            return t / 4;
        }
    }
    
    void main(){
    
        printf("海滩上原来最少有%d个桃子
    ", 5*Peach(1)+1);
        system("pause");
    }

    //题目47:尼科彻斯定理证明
    //任何一个整数的立方都可以写成一串连续奇数的和
    
    //思路:一串连续奇数,可以从1+3+...,当和>整数的立方的时候,可以减去第一个奇数1,继续判断和是否>整数的立方
    //如果仍然大于整数的立方,再减去第二个奇数,一直继续直到和小于整数的立方时,末尾再加上 最后的奇数+2
    #define _CRT_SECURE_NO_WARNINGS
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<assert.h>
    
    void main(){
        int tnum = 0;
        int num = 0;
        int tsun = 0;
        int index = 0;
        int k = 1;
        int i = 1;
        printf("请输入一个整数
    ");
        scanf("%d", &tnum);
        //断言
        assert(tnum != 0);
        num = tnum*tnum*tnum;
        while (1){
            tsun += i;
            i += 2;
            if (i>num)
            {
                break;
            }
            //当和大于整数的立方时,进行减少奇数操作
            if (tsun>num)
            {
                index = tsun;
                k = 1;
                //从1开始,不断减去前面的奇数
                while (index > num){
                    index -= k;
                    k = k + 2;
                }
                //如果结果不等于num,说明不是连续的奇数,需要在后面继续追加一个奇数
                if (index != num)
                {
                    continue;
                }
                else{
                    //打印结果
                    for (int m = k; m+2 <=i; m=m+2)
                    {
                        if (m+2>=i)
                        {
                            printf("%d", m);
                        }
                        else{
                            printf("%d+", m);
                        }
                    }
                    break;
                }
            }
            //当和等于整数的立方时
            else if (tsun==num)
            {
                //打印结果
                for (int m = 1; m+2 <=i; m = m + 2)
                {
                    if (m + 2 >= i)
                    {
                        printf("%d", m);
                    }
                    else{
                        printf("%d+", m);
                    }
                }
                break;
            }
        }
        printf("=%d
    ",num);
    
    
        system("pause");
    }

    //题目48:父亲拿出2520个苹果,按照写在纸上的数量分给6个兄弟,每个人分到的苹果数量都不相同
    //他说:老大,把你分到的苹果的1/8给老二,老二拿到后,连同原来的苹果分1/7给老三,老三拿到后,
    //连同原来的苹果分1/6给老四,以此类推,最后老六拿到后,连同原来的苹果分1/7给老大,
    //这样你们每个人分到的苹果数量就一样多了。求出原来各兄弟分得多少个苹果。
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    
    //思路:从老二开始分析:老二没分苹果时苹果的数量  =  老大原有的苹果数量*(1/8) +  老二原有的苹果数量
    //就老二比较特殊,后面的就比较规律   
    //老三没分苹果时苹果的数量  =  老二没分苹果时苹果的数量*(1/7) +  老三原有的苹果数量
    //按照此规律,最后6个人苹果的数量相等  都是420个
    //那么   老二没分苹果时苹果的数量*(6/7) = 420,由此可以求出  老二到老六没分苹果时苹果的数量
    //老大的最终苹果数量420  =  老六没分苹果时苹果的数量*(1/3) +  老大原有的苹果数量*(7/8)
    //由此可以求出老大原有的苹果数量,进而可以求出老二原有的苹果数量
    
    void main(){
        //x[6]表示原来的苹果,y[6]表示拿到苹果不分给其他人的苹果数量
        int x[6] = { 0 }, y[6] = {0};
        //根据分析  老二拿到的苹果(不分给老三)=老大以前的苹果*(1/8)+老二原来的苹果
        //即;老二原来的苹果=老二拿到的苹果(不分给老三)-老大以前的苹果*(1/8)
    
        for (int i = 1; i < 6; i++)
        {
            y[i] = 420 * (8 - i) / (7 - i);
        }
        //获取老大原来的苹果数
        //420=老六苹果数(不分给别人)*1/3+老大原来苹果数(7/8)
        //老大原来苹果数=(420-老六苹果数(不分给别人)*1/3)*8/7
        //y[0]=x[0]的解释   老大拿到苹果不分给其他人的苹果数量  就是老大原来的苹果数量
        y[0]=x[0] = (420 - y[5] * 1 / 3) * 8 / 7;
        for (int i = 1; i < 6; i++)
        {
            //y[i - 1] / (9-i)  把老二没分苹果的数量*(1/7)+老三原有的数量 ==老三现在没分苹果的数量
            //老三原有的数量==老三现在没分苹果的数量  -  老二没分苹果的数量*(1/7) 
            x[i] = y[i] - y[i - 1] / (9-i);
        }
        int sun = 0;
        for (int i = 0; i < 6; i++)
        {
            sun += x[i];
            printf("第%d个兄弟的原来的苹果数量%d
    ",i+1,x[i]);
        }
        printf("总数量是%d
    ",sun);
        system("pause");
    }

  • 相关阅读:
    SpringBoot+Vue+HIKVSION实现摄像头多选并多窗口预览(插件版)
    Vue+Video.js播放m3u8视频流(海康威视摄像头+RTMP服务+FFmpeg)
    Vue+Openlayers中实现地图旋转
    Vue中实现检测当前是否为IE模式(极速模式还是兼容模式)
    Vue+Openlayer使用overlay实现弹窗弹出显示与关闭
    Vue+Openlayers实现显示图片并分优先级多图层加载
    Vue+Openlayer使用Draw实现交互式绘制线段
    ActionScriopt 产生随机颜色
    在AS3中格式化日期
    ArcGis For Flex 之 QueryTask地理坐标展现【原创】
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5159124.html
Copyright © 2011-2022 走看看