刷题笔记 1

RAD Studio 10.2.3 测试√


题目来源:CSDN技能树


1、切面条

一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?
刷题笔记 1_第1张图片

总结:
接口数规律 --> n次折叠接口数 = (n - 1)次折叠接口数 * 2 + 1
根数与接口数的关系 --> 根数 = 接口数 + 2
根数与折叠次数的关系 --> 根数 = 2^(折叠次数) + 1


2、门牌制作

小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

#include 
using namespace std;
int main()
{
    int ans = 0, x;
    for (int i = 1; i <= 2020; i++)
    {
        x = i;
        while (x)
        {
            ________________;
        }
    }
    cout << ans;
    return 0;
}

提示:
利用循环将当前数字的每一位求出,分别进行判断即可

==========================================================

var
  a, i: Integer;
  mTempi: Integer;
  mCnt: Integer;
begin
  for i := 1 to 2020 do
  begin
    a := i;
    while True do
    begin
      // 取最后一位数(通过取余数的方式获取)
      mTempi := a mod 10;

      // 如果这个数是指定的数字
      if mTempi = 2 then
      begin
        Inc(mCnt);
        Memo_Log.Lines.Add(IntToStr(i));
      end;

      // 取完最后一位数后,将这个数 / 10
      a := Trunc(a / 10);

      // 如果缩小后的数 <= 0 就表示 i 的每一位都已经判断完了
      if a <= 0 then
      begin
        Break;
      end;
    end;
  end;
  Memo_Log.Lines.Add('使用2的次数=' + IntToStr(mCnt));
end;

3、微生物繁殖

假设有两种微生物 X 和 Y
X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
现在已知有新出生的 X=10, Y=89,求60分钟后Y的数目。
如果X=10,Y=90呢?
本题的要求就是写出这两种初始条件下,60分钟后Y的数目。

#include 
using namespace std;
int main()
{
    int x = 10, y = 90;
    for (int i = 1; i <= 120; i++)
    {
        ________________;
    }
    cout << y << endl;
}

提示:
分析可知,Y分别会在0.5,1.5,2.5······时被吃,所以,把60分钟分成120份,则在除以2余数为1时,Y的数目减少X个

==========================================================


const
  CONST_TIME = 120;     // 多少个0.5分钟
var
  i: Integer;
  x, y: Integer;
begin
  {
x 3分钟 需要翻倍(*2)
y 2分钟 需要翻倍(*2)
新X 半分钟 会让 y 减少 新x 个
老X 1分钟 会让 y 减少 老x 个

从上面4个条件中可知:
最小时间单位 = 0.5分钟
新x吃完后变成老x 需要间隔一分钟才开始吃
比如时间0新生的x 在0.5分钟吃掉y 这批x下次吃是1.5分钟的时候 第二次吃是 2.5分钟
在3分钟的时候出生一批新的x 3.5分钟的时候不管是老的还是新的x都会吃掉y
以此类推
4.5分钟 吃y  5.5分钟吃y  6分钟前两批x继续繁殖 6分半刚好这三批x都可以吃y
由此可以得到规律:x在 0.5 1.5 2.5 3.5 4.5 ... 后续每隔一秒都会吃y

时间每次到 半分钟 2分钟 3分钟 分别触发不同的事件(上面条件可以看成不同的事件)
  }

  x := 10;
  y := 90;

  for i := 1 to CONST_TIME do
  begin
    if i mod 2 = 1 then
    begin
      // 半分钟事件
      y := y - x;
    end;

    if i mod 4 = 0 then
    begin
      // 2分钟事件
      y := y * 2;
    end;

    if i mod 6 = 0 then
    begin
      // 3分钟事件
      x := x * 2;
    end;
  end;


  Memo_Log.Lines.Add('y=' + IntToStr(y));
end;


一点点笔记,以便以后翻阅。

你可能感兴趣的:(刷题笔记,delphi,刷题笔记)