RAD Studio 10.2.3 测试√
题目来源:CSDN技能树
1、切面条
一根高筋拉面,中间切一刀,可以得到2根面条。
如果先对折1次,中间切一刀,可以得到3根面条。
如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?
总结:
接口数规律 --> 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 <bits/stdc++.h>
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 <iostream>
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;
一点点笔记,以便以后翻阅。