2024.12.08学习笔记

目录

1.数组练习

1.1数组练习

2.全排列的思路(运用到深搜)

2.1全排列的思路(运用到深搜)


1.数组练习

1.1数组练习

先是一个思路比较容易理清楚的数组问题,如下:

美国数学家维纳(N.Wiener)智力早熟,一次,他参加某个重要会议,年轻的脸孔引人注目。
于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。
这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。” 请你推算一下,他当时到底有多年轻。

解题思路:这道题可以将问题提供的条件拆分成两个部分,先将第一个条件执行,达到将数据范围缩小的目的,再将数据放入第二个条件进行判断,这样会清晰一些。

具体操作:利用一个for循环将满足立方是个4位数,4次方是个6位数的数求出来,这里我们说明的话就用a表示这个数。然后我们要判断是否正好包含了0到9,我这里采用的是将每个数字都提取出来,即将该数构成的4位数和6位数这十个数字通过运算结合为一个十位数,再利用取模将每个数取出来放入一个新的数组中。此时就可以让该数组的每个数依次比较,查找是否有相同的数,如果有则表示a不满足条件,反之则为正确的年龄。

话多不如代码清楚,上代码:

#include<stdio.h>
int main()
{
	int i = 1;
	int three, four;
	long long a[100];
	int num = 0;
	long long A = 0;
	int j = 0;
	int b[100];
	int f = 1;
	for (i = 1; i < 100; i++)//找出满足第一个条件的数,缩小数据范围
	{
		three = i * i * i;
		four = i * i * i * i;
		if (three >= 1000 && three <= 9999 && four >= 100000 && four < 999999)
		{
			a[f] = i;
			/*printf("%d ", a[f]);*/
			f++;
			num++;//标记有几个数满足
		}
		if (three > 9999 || four > 999999)
			break;
	}
	printf("\n");
	for (i = 1; i <= num; i++)
	{
		/*printf("%d\n", a[i]);*/
		A = a[i] * a[i] * a[i] * 1000000 + a[i] * a[i] * a[i] * a[i];//将数据合并
		for (j = 1; A > 0; j++)//将每个数字提出
		{
			b[j] = A % 10;
			A = A / 10;
			
			/*printf("%d ", b[j]);*/
		}
		/*printf("\n");*/
		for (f = 1; f < 10; f++)
		{
			for (j = f + 1; j <= 10; j++)
			{
				if (b[f] == b[j])
					break;

			}
			if (b[f] == b[j])
				break;
		}
		if (b[f] != b[j])
		{
			printf("年龄是%d", a[i]);
			break;
		}
	}

	return 0;
}

贴主在写这道题时,出现了一点问题,

有些数据的通过流程所生成的十位数在取模时,没有办法得到每个位上的数。即以下情况:

在询问大佬之后,发现是因为A的类型为int,而传递给A的数据太大了导致溢出,所以要将A改为long long类型。同时!!a数组内的元素的数据类型也要改为long long,因为在执行a[i] * a[i] * a[i] * 1000000 + a[i] * a[i] * a[i] * a[i];时,一个个逐步去乘,会将得到的数据存储在int类型中,而数据太大也会溢出,所以要将a数组改为long long。

(其实对于数组有两种改法:

1.将数组a改为直接定义为long long类型。 

2.将a[i] * a[i] * a[i] * 1000000 + a[i] * a[i] * a[i] * a[i];

改为(long long)a[i] * a[i] * a[i] * 1000000 + a[i] * a[i] * a[i] * a[i];

以上就是今天的数组学习笔记。

2.全排列的思路(运用到深搜)

2.1全排列的思路(运用到深搜)

贴主今天是第一次接触dfs,属实有点懵,下面利用全排列题目整理一下今天理解深搜的一点思路:

题目如下:

按照字典序输出自然数 1到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

思路:在处理这道题时,核心是找到全部的不重复的排列,这里使用递归函数可以解决。首先,要了解dfs的思路,我们可以将每次要用到的数看为一个节点,在一个节点时我们要继续向下寻找下一个节点,如果已经没有下一个节点,我们就将数据拿出来,这就是一种路径,接下来我们要回溯,返回上一个节点,找一找它有没有其他的下一个节点,如果没有就再次回溯到上一个节点,再次寻找该节点的其他没有使用过的节点(这里有一个点要注意,在范围上一个节点时,我们会将已使用的节点重新标记为没有使用过,这样才能找到所有情况)

(具体的解题方法和注意事项明天我会更新,因为贴主今天花了很多时间也只是将思路终于理清楚了一点点,明天会尝试敲代码,然后再分享关于深搜的更加详细的笔记)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值