DHU上机打卡D26

1.数字串处理

明明的爸爸经常对明明进行数学启蒙教育。有一天他和明明做了一个游戏,对一串数字进行处理。明明的爸爸首先给明明一串数字,在这串数字中有很多数字会连续重复出现很多次,爸爸就要求明明把其中连续重复出现次数最多的那个数字找出来。如果有很多个数字连续出现的次数相同,即重复出现次数最多的数字不止一个,那就要明明找出第一次出现该重复次数的那个数字。 例如有一串数字:2 2 2 1 1 1,其中2出现了3次,1也出现了3次,而明明要找出的那个数字是2,因为2是第一次重复出现3次的那个数字。 明明的爸爸现在已经设计好了很多组这样的数据,但是他不想自己来寻找,他想让你帮他写一个程序,找出出现次数最多的那个数字,然后他手中就有一份标准答案,可以用来检查明明到底做得对不对。 明明爸爸的问题可以归结为:给你一串数字,找出在这串数字中连续出现次数最多的那个数字;若有多个数字连续出现的次数相当,则找出第一次出现该次数的那个数字。

个人总结:

1.运用字符串进行处理分析,逐个遍历字符串,若当前数字和前一个相同 → 当前连续次数 + 1;若不同 → 重置当前数字为新数字,当前次数为 1;每次更新后,若当前次数 > 最大次数 → 更新最大次数和对应数字;若当前次数 == 最大次数 → 不更新(保证选第一次出现该次数的数字)。

#include <iostream>

#include <vector>

using namespace std;

int main() {

int n;

while (cin >> n) {

vector<int> nums(n);

for (int i = 0; i < n; i++) {

cin >> nums[i];

}

int maxNum = nums[0];

int maxCount = 1;

int currNum = nums[0];

int currCount = 1;

for (int i = 1; i < n; i++) {

if (nums[i] == currNum) {

currCount++;

} else {

currNum = nums[i];

currCount = 1;

}

if (currCount > maxCount) {

maxCount = currCount;

maxNum = currNum;

}

}

cout << maxNum << " " << maxCount << endl;

}

return 0;

}

2.T的倍数N

明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:"明明,你觉得你对数字敏感吗?"明明毫不犹豫地回答:"那当然,非常敏感。"于是明明的爸爸就说:"好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?" 明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:"这个问题很简单,来考我吧。"于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。 明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1, 1000000] 的范围内没有找到N,则输出"No"。

个人总结:

1.参考豆包进行公式化简,根据设原数 N 的结构为:N = 10 * M + 7(M 是 N 去掉个位 7 后的数,位数为 k 位),得到M = [7*(10^k - T)] / (10T - 1),遍历k次,看结果能否能被整除,若遍历到 k=6(对应 N≤1000000)仍未找到 → 输出 "No"。

#include <iostream>

#include <cmath>

using namespace std;

string findMinN(int T) {

int denominator = 10 * T - 1;

for (int m = 1; m <= 6; m++) {

long long pow10 = pow(10, m-1);

long long numerator = 7 * (pow10 - T);

if (numerator < 0) continue;

if (numerator % denominator != 0) continue;

long long A = numerator / denominator;

long long N = 10 * A + 7;

if (N > 1000000) continue;

int digitCount = to_string(N).size();

if (digitCount != m) continue;

long long newN = 7 * pow10 + A;

if (newN == T * N) {

return to_string(N);

}

}

return "No";

}

int main() {

int T;

while (cin >> T) {

cout << findMinN(T) << endl;

}

return 0;

}

3.最大值

为了培养明明对数学的热爱,明明的爸爸经常想出一些简单有趣且富有数学思想的游戏给明明玩。有一次,明明的爸爸在纸上写了N个数字,有正整数、负整数和0。明明的爸爸给明明一个范围,他可以选大于等于L1个且小于等于L2个的数字(L1≤L2),且这些数字必须是连续的。但是要求明明选出的数的和最大,这样说明明可能不太明白,于是明明爸爸就举了一个简单的例子。 例如有5个数字为"1"、"2"、"3"、"4"、"5",明明可以选择大于等于1个且小于等于2个的数字,也就是说明明可以选择1个数字,或者连续的2个数字。通过观察数字串,最后我们会选2个数字,4和5,他们的和最大,为9。 明明明白爸爸的意思后,就开始玩起游戏来。但是他发现,这个游戏看似简单,其实还是有相当的难度,因为数字越多,选择数字个数范围越大,则题目越难,到后面明明有些不想玩了。于是明明就求助于你,请你帮他写一个程序,来求出和的最大值。 明明的问题可以归结为:有N个数字,从中选择出连续的M(L1≤M≤L2)个数,求出它们之和的最大值。

个人总结:

1.采用枚举法进行数据分析,注意如若都是负数时要按照其绝对值进行计算。

#include <iostream>

#include <vector>

#include <climits>

using namespace std;

int main() {

int N, L1, L2;

while (cin >> N >> L1 >> L2) {

vector<int> nums(N);

for (int i = 0; i < N; i++) {

cin >> nums[i];

}

int maxSum = INT_MIN;

for (int start = 0; start < N; start++) {

for (int len = L1; len <= L2; len++) {

if (start + len > N) {

break;

}

int currentSum = 0;

for (int i = start; i < start + len; i++) {

currentSum += nums[i];

}

if (currentSum > maxSum) {

maxSum = currentSum;

}

}

}

cout << maxSum << endl;

}

return 0;

}

翻译:

计算机会按照其被设定的程序方式来解决问题,而不会考虑效率、替代方案、可能的捷径或者代码中的可能错误。能够学习和适应的计算机程序属于新兴的人工智能和机器学习领域的一部分。基于人工智能的产品通常分为两大类:基于规则的系统和基于模式识别的系统。基于规则的系统试图体现人类专家所使用的规则,开发成本往往较高。基于模式的系统则利用有关问题的数据来得出结论。基于模式的系统示例包括语音识别、字体识别、翻译以及新兴的在线营销领域。

一、引言

计算机科学是对构成计算机设备设计与使用基础的理论、实验及工程学的研究。计算机科学起源于英围数学家查尔斯·巴贝奇所做的工作,他于1837年首次提出了可编程的机械计算器。在20世纪40年代电子数字计算机出现之前,计算机科学并未被明确界定为与数学和工程学相分离的独立学科。

自那时起,它衍生出了众多独具特色的研究分支。

2、计算机科学的发展

20世纪40年代末至50年代初计算机科学领域的早期研究主要致力于实现科学与工程领域计算过程的自动化。科学家和工程师们构建了计算的理论模型,使他们能够分析在进行各种计算时,如何采用多种高效的方法。在这段时间里,计算机科学与被称为数值分析的数学分支有相当大的重叠,数值分析这一分支研究的是计算的准确性和精确性。

相关推荐
智者知已应修善业2 小时前
【蓝桥杯单词分析最多字母次数并列字典最小输出】2025-4-15
c语言·c++·经验分享·笔记·算法·蓝桥杯
MR_Promethus2 小时前
【C++11】volatile 关键字
开发语言·c++·volatile
ValhallaCoder6 小时前
hot100-栈
数据结构·python·算法·
WW_千谷山4_sch10 小时前
洛谷B3688:[语言月赛202212]旋转排列(新解法:deque双端队列)
数据结构·c++·算法
Zachery Pole10 小时前
【代码随想录】二叉树
算法
漂流瓶jz10 小时前
UVA-11214 守卫棋盘 题解答案代码 算法竞赛入门经典第二版
c++·算法·dfs·aoapc·算法竞赛入门经典·迭代加深搜索·八皇后
浮生091910 小时前
DHUOJ 基础 88 89 90
算法
fpcc11 小时前
并行编程实战——CUDA编程的Enhancing Memory Allocation
c++·cuda
v_for_van11 小时前
力扣刷题记录7(无算法背景,纯C语言)
c语言·算法·leetcode