首页 > 编程语言 >C++题目收集2

C++题目收集2

时间:2024-09-10 23:51:46浏览次数:3  
标签:题目 收集 int SeqList C++ DataType length template data

这是本专栏的的第二篇收录集,我们一起来看一看那些有意思的题目,拓宽自己的思路。本期的题目有一些难,所以数目少一点。

题目一:约瑟夫环

#include <iostream>
#include <vector>

int josephus(int n, int m) {
    std::vector<int> people(n);
    for (int i = 0; i < n; ++i) {
        people[i] = i + 1; // 初始化人的编号,从1开始
    }

    int idx = 0; // 当前报数的位置
    while (people.size() > 1) {
        idx = (idx + m - 1) % people.size(); // 计算要淘汰的人的位置
        people.erase(people.begin() + idx); // 淘汰该人
    }

    return people[0]; // 返回最后剩下的人的编号
}

int main() {
    int n, m;
    std::cout << "请输入总人数n和报数m:";
    std::cin >> n >> m;

    int result = josephus(n, m);
    std::cout << "最后剩下的人的编号是:" << result << std::endl;

    return 0;
}
/*
在约瑟夫问题的C++解法中,idx = (idx + m - 1) % people.size() 这行代码是核心之一,它负责计算每一轮报数后应该淘汰的人的位置索引。

这里的各个部分含义如下:

idx:当前报数(或说淘汰)的位置索引。
m:报数的数字,即数到m时对应的人会被淘汰。
people.size():当前剩余人数的数量,也即people向量的大小。

代码执行流程如下:

idx + m - 1:由于人的编号是从1起始,而vector的索引是从0起始,因此需要先减去1来对齐。随后加上m,表示从当前位置开始报数,报到m时对应的人将被淘汰。

(idx + m - 1) % people.size():使用取模运算来确保计算出的索引不会超出people向量的范围。在人数逐渐减少的过程中,这个操作能确保索引始终有效。

idx = ...:更新idx的值,为下一轮报数和淘汰做准备。

举例来说,假设当前有7人,报数到3的人将被淘汰。若idx初始为0(即从第1个人开始报数),第一轮淘汰后,idx将更新为(0 + 3 - 1) % 7 = 2,意味着下一轮从第3个人开始报数(因为索引2对应的是第3个人)。随着人数的减少,people.size()的值也会相应减小,确保索引始终在有效范围内。
*/

这个题目我在代码中已经做了一些注释,对其中难懂的,难理解的代码核心进行一个分析,这样大家第一次就可以看的懂,如果没有看懂也不用担心,我会在本周内更新解析。

题目二:线性表的基本功能实现:

#include <iostream>
using namespace std; 

const int MaxSize = 100;            //100只是示例性的数据,根据实际问题具体定义
template <class DataType>          //定义模板类SeqList
class SeqList
{
public:
   	SeqList( );                     //无参构造函数,建立空的顺序表
   	SeqList(DataType a[ ], int n);      //有参构造函数,建立长度为n的顺序表
   	~SeqList( );                    //析构函数
   	int Length( );                   //求线性表的长度
   	int Empety();
   	DataType Get(int i);              //按位查找,查找第i个元素的值
   	int Locate(DataType x );          //按值查找,查找值为x的元素序号
   	void Insert(int i, DataType x);      //插入操作,在第i个位置插入值为x的元素
   	DataType Delete(int i);            //删除操作,删除第i个元素
   	void PrintList( );                 //遍历操作,按序号依次输出各元素
private:
   	DataType data[MaxSize];          //存放数据元素的数组
   	int length;                       //线性表的长度
};

template<class DataType>
SeqList<DataType> :: ~SeqList()
{
		
}

template <class DataType>
SeqList<DataType> :: SeqList()
{
	length = 0;
}

template <class DataType>
int SeqList<DataType> :: Empety()
{
	if(length == 0)
		return 1;
	else
		return 0; 
}

template <class DataType>
int SeqList<DataType> :: Length()
{
	return length;
}

template <class DataType>  
SeqList<DataType> :: SeqList(DataType a[ ], int n)
{
	if (n > MaxSize) 
		throw "参数非法";
	for (int i = 0; i < n; i++)  
		data[i] = a[i];
	length = n;
}

template <class DataType>  
void SeqList<DataType> :: PrintList( )
{
  	for (int i = 0; i < length; i++)
    	cout << data[i];                   //依次输出线性表的元素值
}

template <class DataType>  
int SeqList<DataType> :: Locate(DataType x)
{
   	for (int i = 0; i < length; i++)
    	if (data[i] == x) return i+1;        //返回其序号i+1
   	return 0;                         //退出循环,说明查找失败
}

template <class DataType>  
DataType SeqList<DataType> :: Get(int i)
{
	if (i < 1 && i > length) 
		throw "查找位置非法";
	else 
		return data[i - 1];
}

template <class DataType>  
DataType SeqList<DataType> :: Delete(int i)
{
	if (length == 0) 
		throw "下溢";
	if (i < 1 || i > length) 
		throw "位置";
	int x = data[i - 1];                  //取出位置i的元素
	for (int j = i; j < length; j++)
		data[j - 1] = data[j];           //此处j已经是元素所在的数组下标
	length--;
	return x;
}

template <class DataType>  
void SeqList<DataType> :: Insert(int i, DataType x)
{
  	if (length >= MaxSize) 
	  	throw "上溢";
  	if (i < 1 || i > length + 1) 
	  	throw "位置";
  	for (int j = length; j >= i; j--)
		data[j] = data[j - 1];              //第j个元素存在数组下标为j-1处
  	data[i - 1] = x;
  	length++;
}

int main( )
{
	int r[5] = {1, 2, 3, 4, 5}, i, x;             
   	SeqList<int> L{r, 5};                  //建立具有5个元素的顺序表
   	cout << "当前线性表的数据为:";
   	L.PrintList( );                        //输出当前线性表1 2 3 4 5
   	try 
   	{
   		L.Insert(2, 8);                        //在第2个位置插入值为8的元素
   		cout << endl << "执行插入操作后数据为:";
   		L.PrintList( );                        //输出插入后的线性表1 8 2 3 4 5
   		cout << endl;
   	}catch(char* str){
   		cout << str << "插入操作错误!" << endl;
   	}
   
   	cout << "当前线性表的长度为:" << L.Length( );    //输出线性表的长度6
   	cout << endl;
   	cout << "请输入查找的元素值:";
   	cin >> x;
   	i = L.Locate(x);
   	if (0 == i) cout << "查找失败" << endl;
   	else cout << "元素" << x << "的位置为:" << i << endl;          
   	try
   	{
   		cout << "请输入查找第几个元素值:";
   		cin >> i;
   		cout << "第" << i << "个元素值是" << L.Get(i) << endl;
   	}catch(char* str){
   		cout << "线性表中没有该元素" << endl;
   	} 
   	try 
   	{
		cout << "请输入要删除第几个元素:";
	   	cin >> i;
	   	x = L.Delete(i);                              //删除第i个元素
	   	cout << "删除的元素是" << x <<",删除后数据为:";
   	   	L.PrintList( );                           //输出删除后的线性表
   	}catch(char* str){
   		cout << "删除错误!" << endl;
   	} 
   
	return 0;
}

这个题目的代码有些长,但是并不难懂,我们这里提前写了一个类,之后就简单了。大家尽量看,看看自己可以看懂多少,同样这周之内我会发解析。

感谢大家阅读;以上代码大家可以自己跑一跑试试看,更好理解,如果利用断点观察那就更好了。

让我们下期见,求一个免费的赞。

标签:题目,收集,int,SeqList,C++,DataType,length,template,data
From: https://blog.csdn.net/2301_81280642/article/details/142107401

相关文章

  • 《C++ Primer Plus》学习day3
    C++11新增的内容:char16_t和char32_tchar16_t:无符号,16位,使用前缀u表示char_16字符常量和字符串常量;char32_t:无符号,32位,使用前缀U表示char32_t常量浮点类型C++有三种浮点类型:float、double、longdouble头文件cfloat中对对浮点数进行了限制:比如最低有效位......
  • C++入门 一(命名空间,缺省参数,超详细!!!)
    文章目录C++与C语言的区别命名空间(Namespace)缺省参数C++与C语言的区别C++在保留了C语言所有特性的基础上增加了面向对象编程的支持,并引入了更多的高级特性和工具来提高代码的可读性、可维护性和可扩展性。而C语言则更加简洁和底层,适用于对性能要求极高或对内存管理......
  • c++引用
    c++指针和引用的区别指针和引用在C++中都用于间接访问变量,但它们有一些区别:指针是一个变量,它保存了另一个变量的内存地址;引用是另一个变量的别名,与原变量共享内存地址。指针(除指针常量)可以被重新赋值,指向不同的变量;引用在初始化后不能更改,始终指向同一个变量。指针可以为......
  • C++入门知识
    命名空间为什么会有命名空间?解决C语言中命名冲突的问题。(std是所有c++库的命名空间)解决方法:采用域作用限定符(::):指定编译器搜索的位置。编译器默认的搜索顺序:先局部再全局。命名空间域大体有4种域:全局域、局部域、命名空间域、类域。命名空间域的特点:1.不会影响生命......
  • 挑战不可能篇1——洛谷28分钟14道CCF GESP C++ 一级上机题&洛谷14道题题解
    扯谈今天继续挑战不可能:洛谷28分钟14道题这我个人认为不简单,算上编译、提交、命名等杂七杂八的东东之后,只剩下了大约1分钟/题。本次挑战的是CCFGESPC++一级上机题.这竟然能成功!下面附上每一题第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题......
  • 【C++ Primer Plus习题】14.3
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←问题:解答:main.cpp#include<iostream>#include"queuetp.h"usingnamespacestd;intmain(){ Queue......
  • 【自用20.】C++析构函数
    作用对象销毁前,做清理工作。具体的清理工作,一般和构造函数对应比如:如果在构造函数中,使用new分配了内存,就需在析构函数中用delete释放。如果构造函数中没有申请资源(主要是内存资源),那么很少使用析构函数。函数名:~类型名没有返回值,没有参数并且最多只能有一个析构函数......
  • 【自用19.3】C++构造函数复盘
    定义一个“人”类#include<iostream>#include<Windows.h>#include<string>usingnamespacestd;//定义一个“人类”classHuman{public://公有的,对外的 voideat();//方法,“成员函数” voidsleep(); voidplay(); voidwork(); stringgetName(); in......
  • 【自用14】C++俄罗斯方块-思路复盘3
    在上篇降落函数中使用到了判断游戏是否结束的功能,因此这篇先从判断游戏是否结束开始判断游戏是否结束voidfailCheck(void){if(!moveable(START_X,START_Y,MOVE_DOWN,BLOCK_UP)){setcolor(WHITE);setfont(45,0,_T("隶体"));outtextxy(75,300......
  • 【自用21.】C++-this指针
    Human::Human(intage,intsalary){ cout<<"调用自定义的构造函数"<<endl; this->age=age;//this是一个特殊的指针,指向这个对象本身 this->salary=salary; name="无名"; addr=newchar[64]; strcpy_s(addr,64,"China");}......