5.一个小球从10处落下,每次的弹回之前的高度一半,

请问小球在停止之前一共走过多少间隔?

思路

使用循环进行求间隔,注意要加上原始的高度。更新值时,用它值自身。

详细完成

#include<stdio.h>
float Desin() {
	float sum=0,b;//计算共走的间隔,b是每次除后的高度
	float high=10;//是初始时的高度
	while(high!=0) {
		b = high / 2;//每次落下高度的一半
		sum += b+high;//累加走的间隔
		high = high / 2;//更新high的值(办法堆集:重点注意下,下次重复这样的可参阅)
	}
	return sum;
}
int main(){
	printf("小球停止时分一共走了%f米", Desin());
}

运转成果

小球停止时分一共走了29.999998

复杂度分析

复杂度分析若分析错,请帮助看出的大神帮助指点,这一块很是单薄。

时刻:循坏次数主要与高度有关,高度/2约等于就是高度。所以时刻复杂度为O(n),n为高度。 空间:没有用到递归或许是引用额外的数组存储,所以空间复杂度为O(1);

6.我要经过

“答案正确” 是自动判题体系给出的最令人欢欣的回复。本题属于PAT的“答案正确”大派送——只需读入的字符串满足下列条件,体系就输出”“答案正确”,不然输出“答案过错”。

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

1.字符串中有必要仅有P、A、T这三种字符,不能够包含其它字符;

2.恣意形如xPATx的字符串都能够取得“答案正确”,其间x或许是空字符串,或许是仅由字母A组成的字符串:

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

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

输入格式:

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

输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APAATTAA

输出格式:

每个字符串的检测成果占一行,假如该字符串能够取得“答案正确”,则输出YES,不然输出NO

输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO

思路

条件2标明 ,只要三个字母,别离是P、A、T时分是正确。
条件2标明,在PAT的前后加上相同个数的A或许不加时正确的。如AAAPATAAA
条件3标明,aPbTc正确,那在PT中心参加一个A,最前边和后边也要别离参加一个A。此处的a、b、c理解为占位符号,他们能够代表A或许是空字符即没有。

总的来说可分为:

1.前后无A型,中心有很多A正确 (相对于P和T来说)
2.前后有A型,后A=前A* 中A
根据条件一知当字符个数小于3时,回答过错。接下来讨论个数大于3个时分。
字符个数大于三个时
1.记载P、T个数及它们在字符串中最终出现的方位。用other标明除P、A、T三个字符外的字母个数。
2.P和T的个数只要一个时正确。要没有其他字符,所以other要不等于0;(local_T – local_P)标明中心没有数字或许是PT方位相反时分。
3.使用 后A=前A*中A做最终的判断。

详细完成

#include<stdio.h>
#include <string>
#include <iostream>
#include<cstdio>
using namespace std;
//1.前后无A  PAT  PAAAT
//2.前后有A,后A=前A*中A   APATA   APAATAA
int main() {
	int num;//循坏次数
	printf("请输入需要检测的字符串个数\n");
	scanf_s("%d", &num);
	while (num--) {
		char str[201];//界说一个字符数组
		str[200] = '\0';//解决strlen(str)的边界警告处理,将最终一位复制为完毕;可不用
		//printf("请输入需要检测的字符串\n");
		scanf_s("%s", str, 201);	
		int num_P = 0, num_T = 0,other = 0;//num_P标明P的个数,num_T标明T的个数,other标明除了P、A、T三个字符外的的字符个数
		int local_P = -1, local_T = -1;//local_P最终一个P的方位,local_T最终一个T的方位
		//字符个数小于3时
		if (strlen(str) < 3) {
			printf("NO\n");
			continue;//完毕本次循环
		}
		//字符个数大于3时,对P、A、T别离计算其个数
		for (int i = 0; i < strlen(str); i++) {
			if (str[i] == 'P') {
				num_P++;
				local_P = i;//记载P的最终一个方位
			}
			else if (str[i] == 'T') {
				num_T++;
				local_T = i;
			}
			else if (str[i] != 'A') {//除了A之外别的字符,
				other++;
			}
		}
		//P和T的个数只要一个,要没有其他字符,所以other要不等于0;(local_T - local_P)中心没有数字或许是PT方位相反时分
		if (num_P != 1 || num_T != 1 || other != 0|| (local_T - local_P)<=1) {
			printf("NO\n");
			continue;
		}
		//APAATAA 后A=前A*中A
		//before_x为P前面A的个数,middle_x为P和T之间的个数,back_x为T到字符串成果的个数
		int before_x = local_P, middle_x = local_T - local_P-1, back_x = strlen(str) - local_T - 1;
		if (back_x - before_x * (middle_x - 1) == before_x) {
			printf("YES\n");
		}
		else {
			printf("NO\n");
		}
	}
	return 0;
}

运转成果

请输入需要检测的字符串个数
10
PAT
YES
PAAT
YES
AAPATAA
YES
AAPAATAAAA
YES
xPATX
NO
PT
NO
WHatever
NO
APPAATAA
NO
APT
NO
APAATTAA
NO

复杂度分析

时刻:外层while循环n次,内for也要循环m次,所以时刻复杂度为O(n*m); 空间:用到了char的字符数组,因而空间复杂度为数组的巨细O(n);

总结

简略的题目有思维,也无法用代码写出来,困难的题目还在是毫无头绪,之前的学习又悉数还回去了。

今日收成,学到了scanf() 的用法:scanf这个函数有隐患,所以VS建议运用他们自己开发的scanf_s,假如你要用scanf要去VS里边装备一下。
字符串的输入界说需要用char,而不是string(string是个类对象不能用scanf输入的)。
字符串输入用 %s,而c里边的字符串是char[],用c语音写就要先声明一个char[]

解决C言语的scanf_s()函数问题

本篇代码运用编辑Visual Studio 2022,在运用字符串的输入时报错。因而查阅资料得以解决,资料来源:blog.csdn.net/qq_43309823…

为什么现在要用scanf_s()?

从vc++2005开端,VS体系供给了scanf_s()。在调用该函数时,有必要供给一个数字以标明最多读取多少位字符。
很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的巨细值,避免引用到不存在的元素,有时黑客能够使用原版的不安全性黑掉体系。比方:char d[20];写成scanf_s(“%s”,d,20);才是正确的,有这个参数20使准确性进步。(百度百科)

怎么运用scanf_s()

输入整型时分:

//以下代码没有测验出:成果为2,由于输入两个数a和b
	int i, b;
	int result;//函数返回值
	scanf_s("%d", &i);
	scanf_s("%d %d", &i, &b);
	result = scanf_s("%d %d", &i, &b);
	printf("%d", result);

这是我运转的成果:若有什么地方过错,请大神指出,我没有得出代码内的注释内容;

【蓝蓝计算机考研算法】-day03小球反弹到最终静止共走的距离&我要通过

字符的时分,scanf_s()的安全性就表现出来,:

char d, e[80];
scanf_s("%c %s", &d,1, &e,80);//字符c输入1个,d后边跟1;e字符数组80个,所以e后边加80