/*一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?(n<=10)*/
#include<iostream>
using namespace std;
int main()
{
int n;
double ans1 = 100, ans2 = 100;
cin >> n;
for (int i = 0; i < n - 1; i++)
{``
ans2 *= 0.5;
ans1 += ans2 * 2;
}
ans2*= 0.5;
cout <<"第"<<n<<"次落地时共经过"<< ans1 << "m" <<" "<<"第"<<n<<"次反弹" << ans2 << "m" << endl;
}
/*段誉身具凌波微波,动无常则,若危若安,一次能走一级台阶或者两级台阶,他要爬一段30级的山路,问有多少种走法?分析如何计算,然后编程解答。
进阶问题:当他轻功熟练度提升,一次最多可以走三级,那就结果有什么变化?后来走火入魔了,不能走一级,只能走二或三级,又有什么变化?
*/
//递归问题
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, a, b, c, d;
cin >> n;
vector<int> dp1(n + 1, 0);
vector<int> dp2(n + 1, 0);
vector<int> dp3(n + 1, 0);
//初始化
dp1[1] = 1, dp1[2] = 2; dp2[1] = 1, dp2[2] = 2, dp2[3] = 4; dp3[1] = 0, dp3[2] = 1, dp3[3] = 1;
if (n <= 2)
{
a = dp1[n];
b = dp2[n];
c = dp3[n];
}
else
{
for (int i = 3; i <= n; i++)
{
dp1[i] = dp1[i - 1] + dp1[i - 2];
}
a = dp1[n];
for (int i = 4; i <= n; i++)
{
dp2[i] = dp2[i - 1] + dp2[i - 2] + dp2[i - 3];
}
b = dp2[n];
for (int i = 4; i <= n; i++)
{
dp3[i] = dp3[i - 2] + dp3[i - 3];
}
c = dp3[n];
}
cout << a << " " << b << " " << c;
return 0;
}
/*小陆每天要写一份工作日报,日报标题含有日期。
几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断.*/
#include<iostream>
using namespace std;
#include<string>
const int NUM = 105;
int A[12] = { 31,29,31,30,31,30,31,31,30,31,31,31 };
int B[12] = { 31,28,31,30,31,30,31,31,30,31,31,31 };
int main(int argc, const char* argv[]) {
int T, y1, m1, d1, y2, m2, d2, temp1, temp2, Day;
int week[NUM];
cin >> T;
for (int i = 0; i < T; i++) {
week[i] = 0;
cin >> y1 >> m1 >> d1;
Day = 0;
if (y1 % 400 == 0 || (y1 % 4 == 0 && y1 % 100 != 0)) {
for (int i = 0; i < m1 - 1; i++) {
Day += A[i];
}
Day += d1;
}
else {
for (int i = 0; i < m1 - 1; i++) {
Day += B[i];
}
Day += d1;
}
temp1 = y1 - 1 + (y1 - 1) / 4 + (y1 - 1) / 400 - (y1 - 1) / 100 + Day;
temp1 = temp1 % 7;
if (y1 == 1970 && m1 == 1 && d1 == 1) temp1 = 5;
if (y1 == 1970 && m1 == 1 && d1 == 2) temp1 = 6;
if (y1 == 1970 && m1 == 1 && d1 == 3) temp1 = 0;
cin >> y2 >> m2 >> d2;
Day = 0;
if (y2 % 400 == 0 || (y2 % 4 == 0 && y2 % 100 != 0)) {
for (int i = 0; i < m2 - 1; i++) {
Day += A[i];
}
Day += d2;
}
else {
for (int i = 0; i < m2 - 1; i++) {
Day += B[i];
}
Day += d2;
}
temp2 = y2 - 1 + (y2 - 1) / 4 + (y2 - 1) / 400 - (y2 - 1) / 100 + Day;
temp2 = temp2 % 7;
if (y2 == 1970 && m2 == 1 && d2 == 1) temp2 = 5;
if (y2 == 1970 && m2 == 1 && d2 == 2) temp2 = 6;
if (y2 == 1970 && m2 == 1 && d2 == 3) temp2 = 0;
if (temp1 == temp2) week[i] = 1;
}
for (int i = 0; i < T; i++) {
if (week[i]) cout << "True" << endl;
else cout << "False" << endl;
}
return 0;
}
/*有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
凡报到3的人退出圈子,问最后留下的是原来第几号的那位*/
#include<iostream>
using namespace std;
int main()
{
int a[1000];//定义一个足够大的数组
int n;//人数
cin>>n;
for (int i = 0; i < n; i++)
a[i] = i + 1;//初始时,i号人后是i+1号人,第n号人下一位是1号,形成一圈
int j = 0, k = 0, m = 0;//轮到第j个人报号数字k
/*模拟报数*/
while (j == 0)
{
for (int i = 0; i < n; i++)
{
if (a[i]!=0)
{
k++; j++;
}
if (k == 3)
{
a[i] = 0;
k = 0;
}
}
if (j == 1)
{
j = 1;
}
else
{
j = 0;
}
}
while (a[m] == 0)
{
m++;
}
cout<<a[m]<< endl;;
return 0;
}