倒置字符串、猜名次、猜凶手、杨辉三角

这篇具有很好参考价值的文章主要介绍了倒置字符串、猜名次、猜凶手、杨辉三角。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 文章来源地址https://www.toymoban.com/news/detail-461582.html

例一:倒置字符串

例二:猜名次

例三:猜凶手

例四:杨辉三角

方法一 

方法二 


 

例一:倒置字符串

首先我们先来看一下题目具体要求

倒置字符串、猜名次、猜凶手、杨辉三角

再来看一下我们所需要的效果

倒置字符串、猜名次、猜凶手、杨辉三角

 这里呢,博主给出两种思路,一种是先将整个字符串逆序,再将单个单词逆序;另一种是先将单个单词厉旭,再将整个字符串逆序

第一种
I like beijing.
.gnijieb ekil I
beijing. like i
第二种
I ekil .gnijieb
beijing. like I

 这里博主采用的是将整个字符串逆序,再将单个单词逆序(采用的是指针,若有宝子不懂得,可以看看博主以前得文章)因为需要逆序整个字符串和每个单词,所以博主在这儿将逆序这个功能单独拿出来,实现函数如下

void jiaohuan(char* p1, char* p2)
{
	while (p1 < p2)//退出循环的条件
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2--;
	}
}

我们有了这个函数后,后面需要逆序时我们就只需要调用就好了

当我们逆序了整个字符串后,逆序每个单词成了我们的难点,首先我们得知道,单词与单词用什么来判断,如何判断结束:单词与单词间我们用空格,结束我们们用‘\0'来判断

这里博主引入两个指针

	char* start = arr;
	char* cur = arr;

 start不用动,cur遍历整个数组,原理如下

倒置字符串、猜名次、猜凶手、杨辉三角

其实到这儿我们基本多思考一下就大概可以想到解题代码了,如果没有思路,就浅看一下博主写的吧

while (*cur)
	{
		while (*cur != ' '&&*cur!='\0')//判断跳出循环的条件
		{
			cur++;
		}
		jiaohuan(start, cur - 1);//逆序每一单词
		start = cur + 1;//cur当前指的为空格,所一下一单词得开头需要加一
		if (*cur == ' ')//当有空格时,由于cur此时指得是空格,所以遍历时需要向后进一位
			cur++;      //若没有空格,说明字符串已经遍历完成,不可再加一,否则会造成越界
	}

图解如下

倒置字符串、猜名次、猜凶手、杨辉三角

主要功能已完成,我们便可以写出完整代码了,代码如下

#include <stdio.h>

void jiaohuan(char* p1, char* p2)
{
	while (p1 < p2)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2--;
	}
}

int main()
{
	char arr[101];
	gets(arr);
	int len = strlen(arr);
	jiaohuan(arr,arr+len-1);
	char* start = arr;
	char* cur = arr;
	while (*cur)
	{
		while (*cur != ' '&&*cur!='\0')//判断跳出循环的条件
		{
			cur++;
		}
		jiaohuan(start, cur - 1);
		start = cur + 1;
		if (*cur == ' ')
			cur++;
	}
	printf("%s", arr);
	return 0;
}

例二:猜名次

题目具体要求如下

倒置字符串、猜名次、猜凶手、杨辉三角

考虑到一共五个人,直接模拟推理有些太难,计算机最擅长的遍历此时就会派上用场,将每个人从第1到第5来一遍,则一共会产生5^5种可能性,这个只需要一个5层循环即可搞定。

倒置字符串、猜名次、猜凶手、杨辉三角

其实这道题最难的是,如何判断选手那句话为真,其实我们把上述问题给简化一下

 倒置字符串、猜名次、猜凶手、杨辉三角

 我们呢所需要做的只是,对每一位选手说的话只信一半,然后把最后得出名次进行汇总,符合我们的条件就输出

我们发现每一位选手都说了自己与另一名选手的成绩 ,那么我们是否可以把我们循环得到的数字与选手所说的进行判断呢,代码如下

int shuohuang(int m, int n,int x,int y)
//m,n为循环得到选手名词,x,y为选手自己所说名次
{
	if ((m == x && n != y) || (m != x && n == y))
		return 1;
	else return 0;
}

 对每个选手判断后,如果返回值都为1,那么就是我们想要的名次了吗?

这里注意,并不是,博主已经吃过亏了,希望各位宝子可以避免。因为由于循环的原因会导致一些不期望出现的结果出现,因为我并没有查重,所以会出现两个人抢名次的情况,也就是两个人或者更多的人名次相同的情况,例如两个第二,三个第三这样的,所以即使满足了条件,也要查看一下五个人的名次是否重复,这个交给一个函数来执行

int panduan(int a, int b, int c, int d, int e)
{
	if (shuohuang(a, b, 3, 2) && shuohuang(b, e, 2, 4) && shuohuang(c, d, 1, 2) && shuohuang(d, c, 3, 5) && shuohuang(e, a, 4, 1) && (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e))
		return 1;
	else return 0;
}

到这里我们就完成了一大半了,那么还有一个问题,当你遍历到正确答案,该怎么跳出循环呢,看看博主怎么做的吧

	for (a = 1; a <= 5; a++)
	{
		for (b = 1; b <= 5; b++)
		{
			for (c = 1; c <= 5; c++)
			{
				for (d = 1; d <= 5; d++)
				{
					for (e = 1; e <= 5; e++)
					{
						if (panduan(a, b, c, d, e))//判断成功跳出循环
						{
							ret = 1;
							break;//一个break只跳出一个循环
						}
					}
					if (ret == 1)
						break;
				}
				if (ret == 1)
					break;
			}
			if (ret == 1)
				break;
		}
		if (ret == 1)
			break;
	}

 由于一个break只跳出一个循环,所以这里博主用了多个break;

完整代码如下

int shuohuang(int m, int n,int x,int y)
{
	if ((m == x && n != y) || (m != x && n == y))
		return 1;
	else return 0;
}

int panduan(int a, int b, int c, int d, int e)
{
	if (shuohuang(a, b, 3, 2) && shuohuang(b, e, 2, 4) && shuohuang(c, d, 1, 2) && shuohuang(d, c, 3, 5) && shuohuang(e, a, 4, 1) && (a != b && a != c && a != d && a != e && b != c && b != d && b != e && c != d && c != e && d != e))
		return 1;
	else return 0;
}

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = 0;
	int e = 0;
	int ret = 0;
	for (a = 1; a <= 5; a++)
	{
		for (b = 1; b <= 5; b++)
		{
			for (c = 1; c <= 5; c++)
			{
				for (d = 1; d <= 5; d++)
				{
					for (e = 1; e <= 5; e++)
					{
						if (panduan(a, b, c, d, e))
						{
							ret = 1;
							break;
						}
					}
					if (ret == 1)
						break;
				}
				if (ret == 1)
					break;
			}
			if (ret == 1)
				break;
		}
		if (ret == 1)
			break;
	}
	printf("A:%d\nB;%d\nC;%d\nD;%d\nE;%d\n", a, b, c, d, e);
	return 0;
}

例三:猜凶手

题目具体要求如下

倒置字符串、猜名次、猜凶手、杨辉三角

本题代码简单,但是呢思维巧妙,相信各位宝子看完代码就可以理解了

#include<stdio.h>
int main()
{
   int killer = 0;
   //分别假设凶手是a,b,c,d,看谁是凶手时满足3个人说了真话,一个人说了假话
   for (killer = 'a'; killer <= 'd'; killer++)
   {
    if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
     printf("凶手是:%c", killer);
   }//只需要一个个遍历,满足这四个人中三个人的条件即可判断出来
   return 0;
}

例四:杨辉三角

题目要求为

倒置字符串、猜名次、猜凶手、杨辉三角

题目要求了解呢后,我们来了解一下什么叫杨辉三角吧

杨辉三角(也称帕斯卡三角)相信很多人都不陌生,它是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和。

杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623—-1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

方法一 

其实这道题主要是找到规律就好做了,一起来看看博主的代码吧

#include <stdio.h>
int main()
{
	int n = 0;
	int i = 0;
	int arr[1000] = { 0 };
	scanf("%d", &n);
	for (i = 1; i < n; i++)
	{
		arr[0] = 1;
		int j = i-1;
		int x = 0;
		for (; j >0; j--)
		{
			arr[j] = arr[j - 1] + arr[j];
		}
		for (x = 0; x <i; x++)
		{
			printf("%d ", arr[x]);
		}
		printf("\n");
	}
	return 0;
}

 画图解释如下

倒置字符串、猜名次、猜凶手、杨辉三角

方法二 

 

void yangHuiTriangle(int n)
{
	int data[30][30] = { 1 }; //第一行直接填好,播下种子

	int i, j;

	for (i = 1; i < n; i++) //从第二行开始填
	{
		data[i][0] = 1; //每行的第一列都没有区别,直接给1,保证不会越界。
		for (j = 1; j <= i; j++) //从第二列开始填
		{
			data[i][j] = data[i - 1][j] + data[i - 1][j - 1]; //递推方程
		}
	}

	for (i = 0; i < n; i++) //填完打印
	{
		for (j = 0; j <= i; j++)
		{
			printf("%d ", data[i][j]);
		}
		putchar('\n');
	}
}

 

以上是博主在学习中遇到的难题,在此分享做题经验,对于这些题目有其他见解的友友,欢迎评论去留言探讨。

 

 

到了这里,关于倒置字符串、猜名次、猜凶手、杨辉三角的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

    ✨个人主页:bit me ✨当前专栏:数据结构 ✨每日一语:不要等到了你的人生垂暮,才想起俯拾朝花,且行且珍惜。 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: [[1],[1,1

    2024年02月03日
    浏览(43)
  • 【C语言】【典例详解】【刷题】猜名次&&猜凶手【循环练习】

    目录 猜名次问题 典例题目 题目分析: 代码实现: 运行结果: 猜凶手问题  典例题目 题目分析 代码实现: 运行结果: 猜名次: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二;

    2024年02月07日
    浏览(36)
  • 打印杨辉三角

    这个公式,不好算,我觉得还是杨辉三角算起来方便:c#代码如下:    double 打印杨辉三角(int n)//n必须是偶数,展开项是n+1,中间项是n/2,此处返回中间项的概率202306131722         {             //for (int i = 0; i n; i++)             //{             //    //这种方法直接算,使

    2024年02月09日
    浏览(37)
  • C练习——杨辉三角

    题目: 打印近似杨辉三角,行数n自选 百度找的杨辉三角,参考一下: 解析: 把它的全部元素左对齐,就可以看成近似杨辉三角的样子 1 1  1 1  2  1 1  3  3  1 1  4  6  4  1 ……  每个数等于它上方两数之和 每行数字左右对称,由1开始逐渐变大 行数与列数相同,第n行有

    2024年01月17日
    浏览(37)
  • 动态规划-杨辉三角

    该算法题分别是: 118. 杨辉三角。 119. 杨辉三角 II 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 1.2.1 示例 1: 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 1.2.2 示例 2: 输入: numRows = 1 输出: [[1]] 1.2.3 提示: 1 = numRows = 30 来源:力扣(LeetCode) 链接:https://

    2024年02月13日
    浏览(40)
  • 【LeetCode】118. 杨辉三角

    题目链接 直觉解法: 以下的理论介绍 可以说和 本题的 代码实现 毫无关系。 这个版本 需要注意 列表的边界 思路: 前一行 两端 补0 模拟。 结合 动图 理解 题目 说明至少 一行,可以跳过 第一行的处理 官方版本

    2024年02月07日
    浏览(38)
  • 杨辉三角(Java)

     实现思路:我们可以先把杨辉三角想象成一个空的二维数组,然后再给它赋值输出即可。 关键在于如何赋值:仔细观察上图可以得出除了 每一行第一个数以及最后一个数(都是1) , 中间的数字规律就是: a[ i ][ j ] = a[ i - 1 ][ j - 1 ] + a[ i - 1 ][ j ] 实现代码: 相信大家更多的

    2024年02月08日
    浏览(35)
  • 【C语言】-- 杨辉三角

    目录 一.什么是杨辉三角? 二.实现方法 1.直角三角形版 2.等腰三角形版 杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 形如: 我们不难看出其存在明显的规律。 即:图片的 两个斜边都是数字1 , 其余的数都等于 它所在层的肩上(

    2024年02月13日
    浏览(45)
  • 每日一题,杨辉三角

    给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 示例 1: 示例 2:

    2024年02月04日
    浏览(36)
  • [LeetCode] #118 杨辉三角

    给定一个非负整数  numRows , 生成「杨辉三角」的前  numRows   行。 在「杨辉三角」中, 每个数是它左上方和右上方的数的和。 杨辉三角:  

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包