4399开发岗位面试编程题

/*一球从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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值