• 软件工程随堂小作业——(C++)


    一、设计思路

      本来我的思路是根据上楼的人数和上楼的层数来计算出平均值,但是我发现这个思路不对。于是我选择了最笨的方法,复杂度为O(n2)。

    (1)输入坐电梯的人数和要去的楼层;

    (2)找到输入楼层里最高的,这样可以减少遍历的次数;

    (3)从最低楼层开始遍历,直到最高层。内部循环计算每个人所要爬楼的层数之和,并比较找出最小的。

    (4)输出结果

    二、源代码

     1 // 电梯.cpp : Defines the entry point for the console application.
     2 //
     3 
     4 #include "stdafx.h"
     5 #include "iostream.h"
     6 #include "stdlib.h"
     7 #define MAXSIZE 15
     8 
     9 void Input(int &num,int flour[])                //输入乘坐电梯的人数及楼层
    10 {
    11     cout<<"请输入乘坐电梯的人数(限定15人):";
    12     cin>>num;
    13     if(num>15)
    14     {
    15         cout<<"输入错误!"<<endl;
    16         exit(0);
    17     }
    18     cout<<"请输入每个人要去的层数(最高18层):";
    19     for(int i=0;i<num;i++)
    20     {
    21         cin>>flour[i];
    22         if(flour[i]>18)
    23         {
    24             cout<<"输入错误!"<<endl;
    25             exit(0);
    26         }
    27     }
    28 }
    29 void getSmallestFlour(int num,int flour[],int &small)    //计算出爬楼梯层数最少的楼层
    30 {
    31     int sum,temp=small;
    32     int highest,lowest;
    33     highest=lowest=flour[0];
    34     for(int i=0;i<num;i++)                //找出要去的楼层中最高的楼层
    35     {
    36         if(flour[i]>highest)
    37         {
    38             highest=flour[i];
    39         }
    40         else                            //找出最低楼层
    41         {
    42             lowest=flour[i];
    43         }
    44     }
    45     for(i=lowest;i<=highest;i++)        //从最低楼层开始遍历直到最高楼层
    46     {
    47         sum=0;
    48         for(int j=0;j<num;j++)
    49         {
    50             if((flour[j]-i)<0)            //计算爬楼梯的层数之和
    51             {
    52                 sum=sum+i-flour[j];
    53             }
    54             else
    55             {
    56                 sum=sum+flour[j]-i;
    57             }
    58         }
    59         cout<<"若停在"<<i<<"层,则爬楼梯的总和为"<<sum<<endl;
    60         if(sum<temp)
    61         {
    62             small=i;            //记录和最小的楼层号
    63             temp=sum;            //记录最小的和
    64         }
    65     }
    66 }
    67 
    68 int main(int argc, char* argv[])
    69 {
    70     int num,aver,flour[MAXSIZE];
    71     Input(num,flour);
    72     aver=0;
    73     for(int i=0;i<num;i++)
    74     {
    75         aver+=flour[i];
    76     }
    77     getSmallestFlour(num,flour,aver);
    78     cout<<"电梯将停在"<<aver<<"层。"<<endl;
    79     return 0;
    80 }

    三、结果截图

    四、心得体会

      上课的时候老师,讲了对这个算法进行优化,终于知道数学学得好有什么优势了。本来觉得编程与数学有关,但是关系不大,现在觉得老师说的不错,算法就是数学。以后碰到这种算法优化的或是对算法要求比较高的,可以深入研究一下。

  • 相关阅读:
    NHibernate OR EES ,不能比较的比较
    Dubbo实现原理和实现机制
    xxljob学习1:整体架构
    xxljob学习2:用户端注册
    xxljob学习4:任务调度器
    xxljob学习3:服务端一次调度
    jQuery源码学习(1)——addClass
    jQuery 选择器项目实例
    javascript权威指南读书笔记(1)——对象
    easyui tabs源码阅读(未完待续)
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/4438209.html
Copyright © 2020-2023  润新知