算法练习-day03小球下落走过的距离和自动判定程序

124 阅读4分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

题目1

一个小球从10处落下,每次的弹回之前的高度一半,请问小球在静止之前一共走过多少距离?

__________________________

思路

这实际上是一个等比数列求和的问题,每次回弹是之前高度的一半则公比就是0.5,通过循环,相加每一次高度,别忘了弹上去后掉下来的高度一样

算法实现

int main()
{
	float h = 10;//定义小球最初的高度并赋值给h
	float height;//每次下降后的小球高度
	float s = 0;//接小球走过的距离
	int num = 0;//记录回弹多少次
	while (h)
	{
		height = h * 0.5;//每次弹起来的高度

		s = s+( height+h);
		h = h * 0.5;
		
		num++;
		
		
	}
	printf("小球经过%d次回弹走过得距离为%.2f\n",num,s);
}

示例

image.png

题目2

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出"“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1.字符串中必须仅有P、A、T这三种字符,不可以包含其它字符;

2.任意形如PATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串:

3.如果aPbTc是正确的,那么aPbATca也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母A组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含1个测试用例。第1给出一个正整数n(≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO

__________________________

思路

⒈条件一可知仅有P,A,T三个字符即正确;

⒉条件二则是□PAT□这种形式的,□可以放空字符串和仅有A组成的字符串(A的个数可以任意个,但有且仅有A)

⒊条件三翻译过来就是‘□P□T□’正确则‘□P□AT□□’也正确,从这就可以看出在P,T 之间多一个A 则T后面多一个□

4.结合条件一二可以看出T 后面的A个数等于P,T 之间A的个数乘以P之前A的个数

算法实现

int main() {
	char s[100];
	gets(s);//从键盘获取字符串
	int len = strlen(s);//读取字符串长度
	int x = 0, y = 0, z = 0;//分别为P之前A的个数;P,T之间A 的个数;T 之后A的个数 
	int p=0, t=0;//分别就是P,T 的个数
	int b=0;
	int a =0; //从后往前计数A的个数时遍历使用
	for (int i = 0; i < len; i++)//计算各部分A的个数
	{
		//判断P,T 的个数是否正确
		if (s[i] == 'P')
		{
			p++;
			if (p > 1) {
				printf("不符合条件");
				break;
			}
		}
		else if (s[i] == 'T')
		{
			t++;
			if (t > 1) {
				printf("不符合条件");
				break;
			}
		}
	}
	//开始计数P 之前A的个数
	x = 0;
	y = 0;
	z = 0;
	
	while (s[b] != 'P')
	{
		if (s[b] == 'A')
		{
			x++;
		}
		b++;
	}
		//计数P,T之间A的个数	
	for (int j = x; s[j] != 'T'; j++)
	{
		if (s[j] == 'A')
		{
			y++;
		}
	}
	a = x + y + 1;
        //计数T后面A的个数
	for (a; a <= len; a++)
	{
		if (s[a] == 'A')
		{
			z++;
		}
	}
	printf("%d\n%d\n%d\n", x, y,z);
        //判断对错
	if (z==x*y)
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

示例

image.png

image.png

总结

第二题花了很长时间去理解题目,题目整清楚了,思路基本上就出来了。 在这里还是想说一下调试的重要性,要知道错在哪里了,就要靠调试来一步一步找到错误, 还有写代码的时候不要一下全部写下来中间不调试,结果写完了再去找错误就不会很方便了。