1.3 变量与常量

变量和常量:

int balance=10; 定义一个变量balance,并初始化值等于10;
const double PI = 3.14159; 定义一个常量,并初始化值等于3.14159

常量是值不变的量,变量是值可以改变的量。

例 1-8

存钱。Uim的银行账户里面有100元。经过下面的操作:

  1. 往里面存了10元;
  2. 购物花掉了20元;
  3. 把里面的钱全部取出。

请在每次操作后输出账户余额,并使用换行符隔开。

解答

建模思路:

将银行卡的钱看做一个整数,每次存取看作做加法和减法。题目就转化成整型变量的加和减并求结果了。

#include<iostream>
using namespace std;
int main()
{
    int balance=100;
    
    balance+=10;
    cout<<balance<<endl;
    
    balance-=20;
    cout<<balance<<endl;
    
    balance=0;
    cout<<balance<<endl;
    
    return 0;
}

程序输出:

110
90
0

例 1-9

当半径 r=5 时,请输出圆的周长、面积和球体积。取 π=3.141593。

解答

建模思路:

根据公式,圆的周长$ C=2πr $,圆的面积$ S=πr^2 $,圆的体积$ V=\frac{4}{3}πr^3 $
题目就是将数字带入公式,就数学算式结果。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    double r=5;
    const double PI=3.141593;
    
    cout<<2*PI*r<<endl;
    
    cout<<PI*pow(r,2)<<endl;
    //cout<<PI*r*r<<endl;
    
    cout<<(4.0/3)*PI*pow(r,3)<<endl; //注意4.0,防止计算机当成整数运算。
    
    return 0;
}

例 1-10

猴子吃桃。一只小猴买了若干桃子。

  • 第一天它吃了这些桃子的一半之后,又贪嘴多吃了一个;
  • 第二天它也吃了剩余桃子的一半,又贪嘴多吃了一个;
  • 第三天他又吃了剩下桃子的一半,并贪嘴多吃了一个;
  • 第四天起来一看,发现桃子只剩下一个了。

请问:猴子买了几个桃子?

解答

建模思路:

首先,这还是一道算术题。
但是直接算的话比较麻烦,但是将思路反过来,从最后一天倒推回去,就十分简单了。

  1. 第四天一个
  2. 第三天就是 (1+1)*2 = 4
  3. 第二天就是 (4+1)*2 = 10
  4. 第一天就是 (10+1)*2 = 22
#include<iostream>
using namespace std;

int main()
{
    int num=1; //第四天
    num=(num+1)*2; //第三天
    num=(num+1)*2; //第二天
    num=(num+1)*2; //第一天
    cout<<num<<endl;
    
    return 0;
}

例 1-11

评测机队列。洛谷的评测任务是单位时间内均匀增加的。8 台评测机30 min 可以刚好把评测队列中的程序评测完毕,10 台评测机6 min 可以刚好把评测队列中的程序评测完毕。

请问:几台评测机可以在 10 min 时刚好把评测队列中的程序评测完毕?

解答

建模思路:

这是著名的“牛吃草问题”的模型。

牛吃草问题,因由牛顿提出而得名,也有人称这一类问题叫做牛顿问题。英国著名的物理学家牛顿曾编过这样一道题目:牧场上有一片青草,每天都生长得一样快。这片青草供给10头牛吃,可以吃22天,或者供给16头牛吃,可以吃10天,期间一直有草生长。如果供给25头牛吃,可以吃多少天?这种类型的题目就叫做牛顿(牛吃草)问题,亦叫做消长问题。

套用到本题,评测队列中初始有 a 条评测任务,每分钟均匀增加,则可以认为每分钟增加 b 条任务。但是我们不知道题目数量。所以可以做如下假设:

  1. 假设 1 台评测机 1 min 可以完成 1 份任务(包括N条评测任务);
  2. 那么 8 台评测机 30 min 完成了 8*30=240 份任务
  3. 同理 10 台评测机 6 min 完成了 10*6=60 份任务
  4. 两者时间上相差 30-6=24 min,任务量上相差 240-60=180 份任务
  5. 即可以推断出,24 min 内,均匀增加的任务为 180 份,即每 min 可以增加 180/24=7.5 份任务。
  6. 将每 min 增加 7.5 份的数据代入,30 min 增加的任务是 30*7.5=225 份,但一共完成了 240 份,即可以推断队列初始有任务量是 240-225=15份。
  7. 知道初始任务量15份,知道每 min 增加任务量 7.5 份,则可以推出 10 min 共有任务 15+(7.5*10)=90 份,我们假设的条件是 1 台评测机 1 min 做 1 份。
  8. 则可以推断需要的评测机数量是 90/10=9 台。
#include<iostream>
using namespace std;

int main()
{
    int n1=8,t1=30,n2=10,t2=6;
    int t3=10;
    double inc_rate=(1.0*n1*t1 - n2*t2)/(t1-t2); 
    double init_num=n1*t1 - inc_rate*t1;
    double ans=(init_num + t3*inc_rate)/t3;
    cout<<ans;
    
    return 0;
}
posted @ 2021-04-10 17:12  CodeSpark  阅读(332)  评论(0)    收藏  举报