A. Sequence with Digits

本文介绍了解决一道编程题的方法,利用longlong类型处理大数范围,通过字符串操作找到位数最小值和最大值,进行有效计算。

题目:样例:

输入
8
1 4
487 1
487 2
487 3
487 4
487 5
487 6
487 7

输出
42
487
519
528
544
564
588
628

思路:

        暴力模拟题,看这数据范围,有些人可能会被唬住,以为是高精度或者容易超时,实际上,long long 型最多可以存储10^18次方,刚刚掐住这个数据范围点,所以我们直接用 long long 存储最后暴力模拟一遍即可,这里 ai 是 10^18次方,而我们需要取到当前位数最小的和最大的,我们可以将 ai 转换为字符串遍历一遍,就是 最多 循环 18 次,就可以取到相应的值,所以不用担心超时的。当我们取到 minx = 0 的时候,后面的 k 都是当前的 ai 了.

代码详解如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define All(x) (x).begin(),(x).end()
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

inline void solve()
{
	long long num,k;
	cin >> num >> k;
	
	// 根据题意,我们的操作是要 --k 的
	while(--k)
	{
		string tem = to_string(num);
		
		// 定义相应的边界值,取到该位数的最大最小值
		int minx = 11;
		int maxx = -1;
		
		// 开始遍历取值
		for(auto i : tem)
		{
			minx = min(minx,(long long)i - '0');
			maxx = max(maxx,(long long)i - '0');
		}
		
		// 如果出现了位数最小值是 0 ,说明后面的 k - i 个数都是当前 ai
		// 退出循环即可
		if(!minx) break;
		
		// 操作获取 ai
		num += (maxx * minx);
	}
	
	// 输出操作后,ak 的值
	cout << num << endl;
}
signed main()
{
//	freopen("a.txt", "r", stdin);
	___G;
	int _t = 1;
	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

题目1.基于CNN+RNN的手写数字图像序列预测 一、实验背景 手写数字识别是计算机视觉中的经典任务。基于此,本实验可以设计一个更有趣的综合性实验:给定一组连续手写数字图像序列,模型需要预测序列中下一个数字。 二、实验要求: CNN(采用:自定义CNN或AlexNet或ResNet等)用于对MNIST手写数字图像进行分类。 RNN(采用:自定义RNN或LSTM或GRU等)用于数字序列进行预测(基于序列的前几个数字预测下一个数字)。 这个任务既涉及图像分类,又涉及序列建模,是CNN + RNN 综合应用的典型案例。 三、数据集 1.图像数据集 名称:MNIST 手写数字数据集,可直接使用PyTorch内置数据集。 torchvision.datasets.MNIST(root='./data', train=True, download=True) 内容:28×28 灰度图像,训练集 60,000 张,测试集 10,000 张 2.序列生成方法 将 MNIST 图像随机组成长度为 5 的序列,用前 4 个数字预测第 5 个数字作为标签。 序列规则示例: l 等差数列:1,3,5,7 → 预测9 l 等比数列:2,4,8,16 → 预测32 l 斐波那契:1,1,2,3 → 预测5 l 简单模式:1,2,1,2 → 预测1 这种方式可以快速生成序列数据,无需额外大数据集。 四、代码框架 1.生成数字序列数据集 class NumberSequenceDataset(Dataset): """数字序列数据集""" def __init__(self, num_samples=5000, sequence_length=5): self.num_samples = num_samples self.sequence_length = sequence_length self.sequences, self.labels = self._generate_sequences() def _generate_sequences(self): """生成多种模式的数字序列""" sequences = [] labels = [] for _ in range(self.num_samples): # 随机选择一种序列模式 pattern_type = np.random.choice(['arithmetic', 'geometric', 'fibonacci', 'alternating']) if pattern_type == 'arithmetic': # 等差数列 start = np.random.randint(0, 5) diff = np.random.randint(1, 4) sequence = [start + i * diff for i in range(self.sequence_length)] next_num = sequence[-1] + diff elif pattern_type == 'geometric': # 等比数列 start = np.random.randint(1, 3) ratio = np.random.randint(2, 4) sequence = [start * (ratio ** i) for i in range(self.sequence_length)] next_num = sequence[-1] * ratio elif pattern_type == 'fibonacci': # 斐波那契数列变种 a, b = np.random.randint(1, 3), np.random.randint(1, 3) sequence = [a, b] for i in range(2, self.sequence_length): sequence.append(sequence[i-1] + sequence[i-2]) next_num = sequence[-1] + sequence[-2] else: # alternating # 交替序列 a, b = np.random.randint(0, 5), np.random.randint(0, 5) sequence = [a if i % 2 == 0 else b for i in range(self.sequence_length)] next_num = a if self.sequence_length % 2 == 0 else b # 限制数字范围在0-9之间(模拟MNIST数字) sequence = [min(max(x, 0), 9) for x in sequence] next_num = min(max(next_num, 0), 9) sequences.append(sequence) labels.append(next_num) return np.array(sequences), np.array(labels) def __len__(self): return len(self.sequences) def __getitem__(self, idx): sequence = torch.FloatTensor(self.sequences[idx]) label = torch.LongTensor([self.labels[idx]]).squeeze() return sequence, label 2.数据加载和预处理 print("=== 数据准备 ===") # MNIST数据变换 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) # 加载MNIST数据集 train_mnist = torchvision.datasets.MNIST( root='./data', train=True, download=True, transform=transform ) test_mnist = torchvision.datasets.MNIST( root='./data', train=False, download=True, transform=transform ) # 创建数字序列数据集 train_sequences = NumberSequenceDataset(num_samples=5000, sequence_length=5) test_sequences = NumberSequenceDataset(num_samples=1000, sequence_length=5) # 创建数据加载器 mnist_train_loader = DataLoader(train_mnist, batch_size=64, shuffle=True) mnist_test_loader = DataLoader(test_mnist, batch_size=64, shuffle=False) sequence_train_loader = DataLoader(train_sequences, batch_size=64, shuffle=True) sequence_test_loader = DataLoader(test_sequences, batch_size=64, shuffle=False) print(f"MNIST训练集: {len(train_mnist)} 张图像") print(f"MNIST测试集: {len(test_mnist)} 张图像") print(f"序列训练集: {len(train_sequences)} 个序列") print(f"序列测试集: {len(test_sequences)} 个序列") 3.模型定义 (1)定义手写数字识别CNN模型(采用:自定义RNN或LSTM或GRU等):补充! (2)定义数字序列预测RNN模型(采用:自定义RNN或LSTM或GRU等):补充! 4.训练模型 (1)训练、优化CNN模型:补充! (2)训练、优化RNN模型:补充! 5.评估模型 (1)评估CNN模型:补充! (2)评估RNN模型:补充! 6.数字序列预测测试 (1)输入数字图像序列,实现下一个数字预测:补充!
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值