C++刷题笔记
主要以自我学习为主,在专业C++课程规划方面的要求较为基础
非常欢迎大家对我这个小菜鸡进行指导55
函数
完全数
某单位在某个湖边举办了一场潜水比赛活动,在这个集体项目中每支队伍共有n名队员需要从A岸潜到B岸,在整个潜水过程中所有队员都需要使用氧气瓶但每队仅有一台氧气设备可用每次最多允许两个人共享一台氧气设备这要求这两人必须同步游泳以确保安全因此完成全程所需的时间取决于较慢那位队员独自完成全程所需的时间由于每位队员都愿意互相配合因此无需挑选特定搭档即可实现资源的有效分配请为比赛制定一种最优策略使最后一名队员能够尽快抵达终点
编程要求: 编写字程,在输入参赛人数n(n < 1000)后,请依次输入每位队员单独游完全程所需的时间数据。程序应计算并输出所有队员最早同时到达终点的时间值。
相关领域知识: 能够利用sort函数完成数组排序的任务,并且必须包含头文件⟨algorithm⟩。
#include<iostream>
using namespace std;
void printInt(int n,int base){
cin>>n>>base;
if(n<0) {cout<<'-';n=-n;}
int m=0,a[100];
while(n){
a[m]=n%base;
m++;
n/=base;
}
for(int i=m-1;i>=0;i--){
if(a[i]>=10){
printf("%c",'A'+a[i]-10);//若使用cout需要重新定义一个字符串
}
else cout<<a[i];
}
}
int main()
{
int n, base;
cin>>n>>base;
printInt(n, base);
return 0;
}
获取日期
设计并实现一个程序,在给定一个输入字符串和指定的要查找的字符的情况下,若指定的字符存在于输入字符串中,则从指定字符最后一次出现的位置起始处输出剩余的部分
编程要求
按照提示,在右侧编辑器处补充代码,并将以下两个变量添加到程序中——一个是字符串型变量(用于存储目标字符串),另一个是单个字符型变量(用于存储目标字符)。当目标字符存在于目标字符串中时,请从目标字符最后一次出现的位置起截取后续所有 characters并返回给调用者。注意不得使用mystrrchr函数完成这一操作。
#include<iostream>
using namespace std;
bool getdate(int d,int &month,int &date);
int m[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int main()
{
int d, month, date, res;
cout << "Please enter the number of days:";
cin >> d;
res = getdate(d, month, date);
if(res)
cout << endl<<"month=" << month << ",date=" << date << endl;
else
cout <<endl<< "wrong number!" << endl;
return 0;
}
bool getdate(int d, int &month, int &date) {//返回地址
int sum = 0, i;
if (d < 1 || d > 366)return false;
else {
i = 0;
do {
sum += m[i];
++i;
if (sum >= d)break;
} while (i <= 12);
month = i;
date = d - sum + m[i - 1];
return true;
}
}
哥德巴赫猜想
根据哥德巴赫猜想,在所有足够大的偶数值中都存在着可以分解为两个素数值之和的情况。如4可分解为2加2、6则由3加3构成、8等于3加5以及50则是由3加上47得到等实例可见该规律的存在性与普遍性。当前任务要求:对于任意输入的偶数值,请将其分解为两个素数值之和并输出结果集
本题的输入是正偶数n,4 <= n <= 1000。
编程要求
为了满足特定需求,在右侧编辑器中补充代码以实现功能,请通过编写函数来检测一个整数是否为质数,并确保其符合规定条件。
可能存在较为零散的注释, 由于在自学过程中逐步积累形成的, 可以说是非常基础.
#include<iostream>
#include<iomanip>//注意补充库
#include<cmath>
using namespace std;
void divide(int n);//提前声明函数
int prime(int a);
int main()
{
int i,m,n;
cin>>n;
if(n==4) cout<<"4=2+2";//单独考虑2的情况
else
{
divide(n);//也可以并入主函数
}
return 0;
}
void divide(int n){
int m,i;
for(i=3;i<n/2;++i)//计算到n/2即可,减少循环运算量
{
if(prime(i)&&prime(n-i)) //已知是偶数且经验上哥德巴赫猜想成立,所以找到一个素数即可
{
cout<<n<<"="<<i<<"+"<<n-i<<endl;
break;//如果不break还会得到多组解,本程序仅需一组
}
}
}
int prime(int a){//判断素数
int i;
for(i=2;i<=sqrt(a);++i){//计算到sqrtA即可,减少循环运算量
if(a%i==0) return 0;//除了1和自身还能找到因数,不是素数
}
return 1;//循环中找不到因数,跳出循环,return1
}
求集合的交集
请用户首先输入集合A的具体数值,并随后依次提供这m个互不相同的整数值;接着,请用户输入集合B的具体数值,并随后依次提供这n个互不相同的整数值;之后的任务是计算这两个给定集合之间的共同元素,并将这些共同元素按升序排列后展示出来;特别地,在确保最终结果唯一的情况下,请将所有共同元素按升序排列后展示出来。
#include <iostream>
#include<algorithm>
using namespace std;
//定义函数intersection
void intersection(int a[],int b[],int c[],int m,int n){
int *cp;
cp=&c[0];//指针指向数组的起始
int num=0;//用于统计数组大小
for(int i=0;i<m;i++){
for(int k=0;k<n;++k){
if(a[i]==b[k]){
*cp=a[i];
++cp;
++num;
break;
}
}
}
if (num==0) cout<<"empty";
sort(c,c+num);
for(int u=0;u<num;u++) cout<<c[u]<<" ";
}
int main()
{
int A[100],B[100],C[100];
int m,n,i,j;
cin>>m;
for(i=0;i<m;i++) cin>>A[i];
cin>>n;
for(i=0;i<n;i++) cin>>B[i];
//调用函数intersection求两个集合的交集
intersection(A,B,C,m,n);
//输出集合C
return 0;
}
1411:区间内的真素数
找出正整数M和N之间(N不小于M)的所有真素数。
真素数的定义:称满足以下条件的正整数P为真素數:即当P是素數时,其反序也是一个素數,则称该整數P為真素數。
例如,11,13均为真素数,因为11的反序还是为11,13的反序为31也为素数。
【输入】
输入两个数M和N,空格间隔,1<=M<=N<=100000。
【输出】
请按照从低到高的顺序排列并呈现介于M与N之间的区域(包含端点M和N)的所有真正素数,并以逗号分隔。若该区域内不存在真正素数,则返回空列表
思路
一个函数将mn之间的数字颠倒,一个函数判断素数
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int reverse(int x);
int isprime(int x);
int main() {
int m, n;
int count = 0;
cin >> m >> n;
for (int i = m; i <= n; i++) {
if (isprime(i) && isprime(reverse(i))) count++;//记下真素数的个数
}
if (count == 0) cout << "No";
else {
for (int i = m; i <= n; i++) {
if (isprime(i) && isprime(reverse(i))) {
cout << i;
count--;
if (count > 0) cout << ",";//最后一个数字后不带逗号
}
}
}
}
int reverse(int x) {
int r=0;//记得初始化
while (x) {
r = r * 10 + x % 10;
x = x / 10;
}
return r;
}
int isprime(int x) {//判断素数
int i = 2;
for (i = 2; i <= sqrt(x); i++) {
if (x % i == 0) return 0;
}
return 1;
}
