寒假题解(1)

1.说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello

代码如下

int i, j;
	char a[100][100];
	for (i = 0;; i++)
	{
		scanf("%s", a[i]);//scanf遇见空格就会停止,所以可以录入一个单词
		if (getchar() == '\n') break;//getchar()这个函数可以输入空格但不能输入换行符
	}
	for (j = i; j >= 0; j--)
	{
		printf("%s", a[j]);
	}
  • scanf会将空格也存放在缓冲区中,如果需要多次提取缓冲区中的信息且不取出空格,需要在调用scanf时,直接将换行符带上,或者在下一次调用时,使用getchar函数

2.素数(函数判断)

利用函数返回值的真假与主函数的判断相结合,判断一个数是否为素数。

该题为判断一个数是否为素数并且输出它随后的10个素数

代码如下

int sushu(int n)//1和0是 是和非
{
	int i;
	if (n == 1 || n == 0)
	{
		return 0;
	}
	for (i = 2; i < n; i++)
	{
		if (n%i == 0)
		{
			return 0;
		}
	}

	return 1;
}


int main()
{
	int n, count;
	scanf_s("%d", &n);
	count = 0;
	while (count < 10)
	{
		n--;
		if (sushu(n))
		{
			printf("%6d", n);
			count++;
		}

	}

	return 0;
}
  • 该sushu函数中,判断的范围可以改为i<sqrt(n),可以减少计算量(PTA中的运行超时)。
    函数基本思路就是判断后返回给主函数1(是素数)或0(不是素数),再通过主函数中if语句判断,即可寻找素数。

3.联系人(单链表的使用与查找)

创建一个联系人册并且根据联系人姓名查询电话

代码如下
#define MAX 101;


struct aa//定义结构体aa用来存储电话号码和姓名
{
	char name[15];
	char tel[15];
};

int reading(struct aa *a)//创建电话号码和姓名,并存入结构体中
{
	int i = 0, n = 0;
	while (1)
	{
		scanf("%s", a[i].name);//输入姓名
		if (!strcmp(a[i].name, "#"))//'#'为结束符.
			break;
		scanf("%s", a[i].tel);//输入电话号码
		i++;
		n++;				//记录的条数
	}
	return n;				//返回的条数
}
void search(struct aa *b, char *x, int n)//用来查询输入的姓名所对应的电话号码
{
	int i = 0;
	while (1)
	{
		if (!strcmp(b[i].name, x))	//查找与输入姓名相匹配的记录
		{
			printf("name:%s  tel:%s\n", b[i].name, b[i].tel);//打印查到的姓名所对应的电话号码
			break;											//终止当前的动作
		}
		else
			i++;
		n--;
		if (n == 0)
		{
			printf("No found!");
			break;
		}

	}
}
int main()
{
	struct aa s[MAX];//定义了一个结构体数组,长度为101
	int num;
	char name[15];
	num = reading(s);//调用函数 reading()  ,创建(姓名+电话)信息的个数
	printf("input the name:");
	scanf("%s", name);
	search(s, name, num);
	return 0;
}


使用最小花费爬楼梯(力扣)


数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

示例 1:

输入:cost = [10, 15, 20]
输出:15
解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。
示例 2:

输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
输出:6
解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。

代码如下

int minCostClimbingStairs(int* cost, int costSize) {
    int dp[costSize + 1];
    dp[0] = dp[1] = 0;
    for (int i = 2; i <= costSize; i++) {
        dp[i] = fmin(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
    }
    return dp[costSize];
}
  • 该题存在着动态规划问题,题目意思可以理解为每个阶梯都有一定数量金币,一次只能跨一个或者两个阶梯,走到一个阶梯就要拿走全部金币,问怎么走才能拿的最少?开局你选前两个阶梯的其中一个作为开头点,并且拿走该楼梯的所有金币。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值