等差数列
属于一维数组的内容
题目
-
问题描述
一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...) 在这个问题中a是一个非负的整数,b是正整数。
写一个程序来找出在双平方数集合S中长度为n的等差数列。双平方数集合是所有能表示成p2+q2的数的集合。 -
输入说明
第一行: N(3<= N<=25),要找的等差数列的长度。 第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。 -
输出说明
如果没有找到数列,输出`NONE'。
如果找到了,输出一行或多行, 每行由两个整数组成:a,b 这些行应该先按b排序再按a排序(均为升序)。
将不会有多于10,000个等差数列。 -
输入范例
5 7
-
输出范例
1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24
解题思路
- 本题需要解决三个主要问题:判断一个数是否可以表示为 p² + q²(0 ≤ p,q ≤ M),在双平方数集合中寻找长度为N的等差数列,排序输出:按特定规则排序输出结果。主要是暴力解法
整体代码
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
// 自定义比较函数,用于排序
bool cmp(const pair<int, int>& p1, const pair<int, int>& p2) {
if (p1.second == p2.second) {
return p1.first < p2.first;
}
return p1.second < p2.second;
}
int main() {
int N, M;
cin >> N >> M;
int maxnum = 2 * M * M; // 最大可能的双平方数
vector<bool> isBisquare(maxnum + 1, false);
// 生成双平方数集合
for (int p = 0; p <= M; p++) {
for (int q = 0; q <= M; q++) {
int num = p * p + q * q;
isBisquare[num] = true;
}
}
// 获取双平方数列表
vector<int> Bisquare;
for (int i = 0; i <= maxnum; i++) {
if (isBisquare[i]) {
Bisquare.push_back(i);
}
}
// 存储结果
vector<pair<int, int> > results;
// 寻找等差数列
for (int i = 0; i < Bisquare.size(); i++) {
int a = Bisquare[i]; // 首项
for (int j = i + 1; j < Bisquare.size(); j++) {
int b = Bisquare[j] - a; // 公差
if (b <= 0) continue;
int last = a + (N - 1) * b;
if (last > maxnum) break;
bool valid = true;
for (int k = 0; k < N; k++) {
int term = a + k * b;
if (term > maxnum || !isBisquare[term]) {
valid = false;
break;
}
}
if (valid) {
results.push_back(make_pair(a, b));
}
}
}
// 输出结果
if (results.empty()) {
cout << "NONE" << endl;
} else {
// 排序
sort(results.begin(), results.end(), cmp);
// 输出
for (int i = 0; i < results.size(); i++) {
cout << results[i].first << " " << results[i].second << endl;
}
}
return 0;
}
注意事项
- 注意"=="和"="之分,不要忘记。
C++ vector常用方法总结 (C++11/14标准)
以下是一些vector最常用的方法,适用于C++11/14版本:
1. 创建和初始化
cpp
#include <vector>
#include <iostream>
int main() {
// 创建空vector
std::vector<int> v1;
// 指定大小并初始化所有元素为0
std::vector<int> v2(5); // 5个0
// 指定大小和初始值
std::vector<int> v3(5, 10); // 5个10
// 使用初始化列表 (C++11)
std::vector<int> v4 = {1, 2, 3, 4, 5};
std::vector<int> v5{6, 7, 8, 9, 10};
// 从数组初始化
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> v6(arr, arr + 5);
// 复制构造
std::vector<int> v7(v4);
return 0;
}
2. 访问元素
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {10, 20, 30, 40, 50};
// 使用下标访问 (不检查边界)
std::cout << "v[2] = " << v[2] << std::endl; // 30
// 使用at()访问 (会检查边界,越界抛异常)
std::cout << "v.at(2) = " << v.at(2) << std::endl; // 30
// 访问第一个和最后一个元素
std::cout << "v.front() = " << v.front() << std::endl; // 10
std::cout << "v.back() = " << v.back() << std::endl; // 50
// 使用迭代器访问
for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// C++11范围for循环
for(int num : v) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
3. 容量相关
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3};
// 获取元素个数
std::cout << "size: " << v.size() << std::endl;
// 检查是否为空
std::cout << "empty: " << (v.empty() ? "true" : "false") << std::endl;
// 获取当前容量
std::cout << "capacity: " << v.capacity() << std::endl;
// 预留空间,避免频繁扩容
v.reserve(100);
std::cout << "capacity after reserve: " << v.capacity() << std::endl;
// 调整大小
v.resize(10); // 大小变为10,新元素值为0
v.resize(15, 5); // 大小变为15,新元素值为5
v.resize(5); // 大小变为5,删除多余元素
std::cout << "size after resize: " << v.size() << std::endl;
// 收缩容量
std::vector<int>(v).swap(v); // 释放多余容量
// 或者使用C++11的shrink_to_fit
v.shrink_to_fit();
return 0;
}
4. 修改操作
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3};
// 添加元素到末尾
v.push_back(4);
v.push_back(5);
// 删除末尾元素
v.pop_back();
// 在指定位置插入元素
v.insert(v.begin() + 1, 99); // 在第2个位置插入99
v.insert(v.begin() + 2, 3, 88); // 在第3个位置插入3个88
// 插入初始化列表 (C++11)
v.insert(v.end(), {66, 77});
// 删除指定位置元素
v.erase(v.begin() + 1); // 删除第2个元素
// 删除区间元素
v.erase(v.begin() + 1, v.begin() + 3); // 删除第2-3个元素
// 清空所有元素
v.clear();
// 重新赋值
v.assign(5, 100); // 5个100
v.assign({1, 2, 3, 4, 5}); // 重新赋值
// 交换两个vector
std::vector<int> v2 = {10, 20, 30};
v.swap(v2);
return 0;
}
5. 常用算法示例
cpp
#include <vector>
#include <iostream>
#include <algorithm> // 包含常用算法
int main() {
std::vector<int> v = {5, 2, 8, 1, 9, 3};
// 排序
std::sort(v.begin(), v.end());
// 反转
std::reverse(v.begin(), v.end());
// 查找元素
auto it = std::find(v.begin(), v.end(), 8);
if (it != v.end()) {
std::cout << "Found 8 at position: " << (it - v.begin()) << std::endl;
}
// 统计元素出现次数
int count = std::count(v.begin(), v.end(), 5);
// 删除重复元素 (需要先排序)
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
// 遍历并输出
for(int num : v) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
6. 二维vector
cpp
#include <vector>
#include <iostream>
int main() {
// 创建3x4的二维vector,初始化为0
std::vector<std::vector<int>> matrix(3, std::vector<int>(4, 0));
// 访问元素
matrix[0][1] = 5;
// 遍历二维vector
for(int i = 0; i < matrix.size(); i++) {
for(int j = 0; j < matrix[i].size(); j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
// 不规则二维vector
std::vector<std::vector<int>> triangle;
for(int i = 0; i < 5; i++) {
triangle.push_back(std::vector<int>(i + 1, 1));
}
return 0;
}
7. 内存管理
cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v;
// 获取底层数组指针
v.push_back(1);
v.push_back(2);
v.push_back(3);
int* p = v.data(); // 获取指向底层数组的指针
std::cout << "First element via pointer: " << *p << std::endl;
// vector扩容会导致迭代器、指针和引用失效
std::vector<int>::iterator it = v.begin();
int& ref = v[0];
v.push_back(4); // 可能触发扩容
// 注意:扩容后,it和ref可能失效!
return 0;
}
重要注意事项:
- 边界检查 :
[]不检查边界,at()会检查并抛出std::out_of_range异常 - 迭代器失效:插入/删除元素可能导致迭代器失效
- 性能考虑 :
push_back平均时间复杂度为O(1),但可能触发重新分配内存 - 预分配空间 :如果知道大概大小,使用
reserve()可以提高性能
这些是C++11/14中vector最常用的方法,涵盖了大部分日常使用场景。
英文段落翻译
自己翻译
在没有系统设计和工程学以及用户交互界面的情况下,是无法理解物联网的。当代的人类计算机交互模型,无论是命令行,菜单式交互,或者是用户图形界面的,都无法恰当的并且不足够的来满足普适计算要求。适配一个普适计算世界的自然物联网已经出现了。为普适计算进行支持的当代设备,包括智能手机,笔记本电脑,传感器网络,射频识别标签,智能卡GPS设备和其他等等。
在普适计算中,物联网提供了一个能够被唯一识别的,并且位于信息物理的空间中的传感的或者射频连接的设备的网络。物联网大部分是无线连接的,作为一个独立配置的射频识别的标签,低功耗传感器或电子标签的网络。物联网集合了射频识别技术和当代的IP协议第六版基础的网络技术。所有的事物(物体)都有被唯一识别的IP地址。在射频识别WIFI, Zigbee,移动网络及GPS的帮助下,可用IP地址标识的对象能够通过因特网来读取识别,定位,寻址和(或)控制。
2.使能和增效技术
许多技术能被应用在建立物联网基础设施和为了特殊的应用命令的特殊的物联网系统之中。支持的技术被分成两种类别。使能技术建立物联网的基础。在使能技术中追踪(射频识别技术),传感器网络,和GPS是至关重要的。
AI翻译
物联网的实现离不开系统设计、工程学以及用户界面。当代的人机交互模型,无论是命令行式、菜单驱动式还是基于图形用户界面(GUI)的,都已无法适应且不足以满足普适计算的需求。适用于普适计算世界的自然物联网范式尚未真正出现。目前支持普适计算的设备包括智能手机、平板电脑、传感器网络、RFID标签、智能卡、GPS设备等。
在普适计算中,物联网提供了一个由传感器或无线连接的设备构成的网络,这些设备在网络物理空间中可被唯一识别与定位。该物联网主要作为一个由射频标签、低成本传感器或电子标签组成的自配置无线网络进行连接。"物联网"这一术语融合了RFID技术与当今基于IPv6的互联网技术。万物(对象)皆拥有可唯一标识的IP地址。这些可IP识别的对象通过RFID、Wi-Fi、ZigBee、移动网络及GPS等技术的辅助,能够经由互联网被读取、识别、定位、寻址及/或控制。
二、赋能与协同技术
多种技术可用于构建物联网的基础设施以及针对特定应用领域的专用物联网系统。支持性技术可分为两类:赋能技术为物联网奠定基础,其中追踪(RFID)、传感器网络和GPS尤为关键。
单词打卡

下一篇
待续