首页 > 编程语言 >杭电基础100题(2000~2099)C++ 本萌新的刷题日记

杭电基础100题(2000~2099)C++ 本萌新的刷题日记

时间:2024-08-16 22:57:03浏览次数:21  
标签:int double 本萌 cin C++ 杭电 while num include

开始之前

本人是刚学完C++基础语法的萌新,从B站了解到了杭电的100道水题基础题,于是打算开始刷题并在这里写下解题思路和一些想法,以便日后回顾,顺便分享给大家。我的计划是一天15题。

这是我第一次在CSDN上发文章,还不是很熟悉怎么编辑。

基本上每一题都会把代码和感想放这里。

2000 ASCII码排序

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

char a[3];
while (cin >> a) {
	vector<char>v;
	v.push_back(a[0]);
	v.push_back(a[1]);
	v.push_back(a[2]);
	sort(v.begin(), v.end());
	cout << v[0] << " " << v[1] << " " << v[2] << " " << endl;
}

        这里也可以用冒泡排序,但是我学了stl就直接sort偷懒了(好吧其实我两种都写了一遍)。

2001 计算两点间的距离

#include<iostream>
#include <stdlib.h>
using namespace std;

double x1, y1,x2, y2;
while (cin >> x1 >> y1 >> x2 >> y2) {
	double distance = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
	printf("%.2lf\n", distance);
}

        写这题的时候学到的新东西:开方函数,以及如何保留几位小数打印数据。(比较好奇为啥这题通过率比上一题低)

2002 计算球体积

#include<iostream>
#include<vector>
#include<algorithm>
#include <stdlib.h>
using namespace std;

double r;
while (cin >> r) {
	double v = (4 * 3.1415926535 * r * r * r) / 3;
	printf("%.3lf\n", v);
}

       记住球的体积公式就好了。我这里应该直接 define 一个PI,直接写3.1415926535有点不是很美观了,而且如果后面有其他代码又得再写一遍,复用率不高。

2003 求绝对值

#include<iostream>
#include<vector>
#include<algorithm>
#include <stdlib.h>
using namespace std;

double n;
while (cin >> n) {
	cout << abs(n) << endl;
}

       因为我是几个题的代码写在一个cpp文件中的,所以这里看起来会有很多不必要的头文件,实际上它们是其它题的,以后的头文件我就不放出来了,大家自行分辨吧(?)。

2004 成绩转换

int score;
while (cin >> score) {
	if (score < 0 || score>100) {
		cout << "Score is error!" << endl;
	}
	else
	{
		switch (score / 10)
		{
		case 10:
			cout << "A" << endl;
			break;
		case 9:
			cout << "A" << endl;
			break;
		case 8:
			cout << "B" << endl;
			break;
		case 7:
			cout << "C" << endl;
			break;
		case 6:
			cout << "D" << endl;
			break;
		default:
			cout << "E" << endl;
			break;
		}
	}
}

        这题我一开始想到是用switch做,运用整数相除所得结果向下取整的特性可以由0~100分得到0~10的整数。中间想到了既然0~59都是E等级那为什么不直接写在default里呢,只要开头加个判断score是否合理就行了,用不着把判断不合理的score写进switch的default中。

2005 第几天?

vector<int>v1 = { 31,28,31,30,31,30,31,31,30,31,30,31 };
vector<int>v2(v1);	//v2用以存放闰年的每个月天数
v2[1] = 29;
int year, month, day;

while (scanf_s("%d/%d/%d", &year, &month, &day)) {
	int res = 0;	//结果
	//判断是否为闰年
	if (year % 4 == 0) {
		for (int i = 0;i < month - 1;i++) {
			res += v2[i];
		}
		res += day;
	}
	else {
		for (int i = 0;i < month - 1;i++) {
			res += v1[i];
		}
		res += day;
	}
	cout << res << endl;
}

注意遍历的时候 i 最后是 < month - 1 不是 < month 。一开始我还搞错了,发现天数过大。

2006 求奇数的乘积

int size;
while (cin >> size) {
	int acc = 1;
	for (int i = 0;i < size;i++) {
		int num;
		cin >> num;
		acc = acc * (num % 2 == 0 ? 1 : num);
	}
	cout << acc << endl;
}

这题的输入格式卡了我好久……一开始还想把用户输入的string中不是空格的元素存入vector<int>中,然后发现又是不会判断空格又是不会char转int,故放弃此方法。其实题目中的“每行的第一个数为n,表示本组数据一共有n个”是在给你提示,告诉你怎么处理这个长度不定的输入。

2007 平方和与立方和

int a, b;
while (cin >> a >> b) {
	int sum1 = 0; int sum2 = 0;
	for (int i = a; i <= b;i++) {
		if (i % 2 == 0) {
			sum2 += i * i;
		}
		else {
			sum1 += i * i * i;
		}
	}
	cout << sum2 << " " << sum1 << endl;
}

理解题意有点困难(那个input的两个整数是指区间的两端,一开始理解成了就是那两个数),其他还好,没啥可说的。

2008 数值统计

double n;
while (cin >> n) {
	if (n == 0)continue;
	int minu_num = 0;
	int zero_num = 0;
	int posi_num = 0;
	for (int i = 0;i < n;i++) {
		double num;
		cin >> num;
		if (num < 0) {
			minu_num += 1;
		}
		else if (num == 0)
		{
			zero_num += 1;
		}
		else {
			posi_num += 1;
		}
	}
	cout << minu_num << " " << zero_num << " " << posi_num << endl;
}

这里要注意num的类型是double,我一开始写成int是因为思维惯性和没仔细看output示例。

第一行那个n其实还是写成int比较好。

2009 求数列的和

int n, m;
while (cin >> n >> m) {
	double sum = 0;
	double num = n;
	for (int i = 0;i < m;i++) {
		sum += num;
		num = sqrt(num);
	}
	printf("%.2lf\n",sum);
}

        注意要用一个double类型的数据接收n的值然后反腐对num进行开方,因为n是int类型的数据,开方后还是用int接收的话会丢失信息。(虽然double也会丢失信息,但是咱输出精度只要小数点后两位嘛)

2010 水仙花数

int m,n;
while (cin >> m >> n) {
	bool haveNum = false;
	for (int i = m;i <= n;i++) {
		int units = i % 10;
		int tens = (i / 10) % 10;
		int hundreds = (i / 100) % 10;
		if (i == pow(units, 3) + pow(tens, 3) + pow(hundreds, 3)) {
			haveNum = true;
			cout << i << " ";
		}	
	}
	if (haveNum == false) {
		cout << "no";
	}
	cout << endl;
}

        这题没啥可说的,最后记得换行就行。

2011 多项式求和

int n;
while (cin >> n) {
	for (int i = 0;i < n;i++) {
		int m;
		cin >> m;
		double res = 0;
		for (int j = 1;j <= m;j++) {
			res += -(double(1) / j) * pow(-1, j);
		}
		printf("%.2lf\n", res);
	}
}

这题注意一下 1 / j 因为是整数除以整数所以结果也是整数,需要将其中一个数转换成double类型结果才是double.

2006题教会我的输入格式方面的知识在这题又用到了(=^v^=)/

2012 素数判定

bool is_prime(int& num) {
	bool b = true;
	for (int i = 2;i * i <= num;i++) {
		if (num % i == 0) b = false;
	}
	return b;
}
void Problem_2012() {
	int m, n;
	while (cin >> m >> n) {
		if (m == 0 && n == 0)continue;
		bool is_all_prime = true;
		for (int i = m;i <= n;i++) {
			int res = (i * i) + i + 41;
			if (!is_prime(res)) is_all_prime = false;
		}
		if (is_all_prime) {
			cout << "OK" << endl;
		}
		else {
			cout << "Sorry" << endl;
		}
	}
}

一开始写怎么都是输出OK,最后发现原来是把i写成n了(汗)……

封装函数省内存小技巧:引用传递~

2013 蟠桃记

int n;
while (cin >> n) {
	int num = 1;
	for (int i = 1;i < n;i++) {
		num = (num + 1) * 2;
	}
	cout << num << endl;
}

2014 青年歌手大奖赛 评委会打分

int n;
while (cin >> n) {
	multiset<double>s;
	double sum = 0;
	for (int i = 0;i < n;i++) {
		double num;
		cin >> num;
		s.insert(num);
		sum += num;
	}
	sum -= *s.begin();
	sum -= (*--(s.end()));
	double average = sum / (n - 2);
	printf("%.2lf\n", average);
}

我第一次写的时候踩坑了,求平均数的时候除以的是n……

目前是第一天,先更新到这里吧。(不知道以后还能不能回来编辑这篇文章)

标签:int,double,本萌,cin,C++,杭电,while,num,include
From: https://blog.csdn.net/qq_62111349/article/details/141257271

相关文章

  • 了解一下宏定义#define吧c++
    在C++中,宏定义是通过 #define 指令实现的,它用于创建符号常量或宏函数。这是一种预处理指令,意味着它在编译之前被处理。下面是宏定义的用法、理解和重点。宏的基本语法定义常量:#definePI3.14159这里,PI 是一个常量,它的值是 3.14159。在代码中每次使用 PI 时,编译器......
  • 二叉树的递归与非递归遍历:C++实现
    在数据结构的学习中,二叉树是一个非常重要的概念。遍历二叉树是理解和操作二叉树的基础。本文将介绍如何使用C++实现二叉树的递归和非递归遍历,包括前序、中序和后序遍历,并对每种遍历方法的原理进行简要介绍。二叉树节点定义首先,我们定义一个简单的二叉树节点结构:structTreeN......
  • 【CPP】C++模板:初阶到进阶语法与实用编程示例
    关于我:睡觉待开机:个人主页个人专栏:《优选算法》《C语言》《CPP》生活的理想,就是为了理想的生活!作者留言PDF版免费提供:倘若有需要,想拿我写的博客进行学习和交流,可以私信我将免费提供PDF版。留下你的建议:倘若你发现本文中的内容和配图有任何错误或改进建......
  • C++ 小节3
    1、析构函数相关1.析构函数:函数名与类名相同,前面有~,没有返回值,不能写void,没有参数;只能有一个,不能重载2.析构函数的作用:主要在对象销毁时释放申请的堆内存,关闭文件,关闭网络连接,关闭数据库连接等;3.析构函数的执行:(不显式调用,自动执行)1)作用域到了时自动执行析构函数......
  • C/C++内存管理
    文章目录前言C/C++内存分布C语言内存管理malloccallocreallocreallocarrayfreeC++内存管理new/delete内置类型自定义类型operatornew/operatordelete定位new内存泄漏前言        C++的内存管理是程序设计中的一个关键部分,涉及到内存的分配、使用和释......
  • 2024杭电多校第十场 1002树上询问(题解)
    题意给一棵树,每个节点有一个权值,并且权值是一个排列。接下来有多次操作,每次操作要么是交换两个节点权值,要么是询问一个权值区间\([L,R]\),判断是否存在树上的一个路径,使得路径上的权值恰好都在这个区间里分析由于询问的是树上的一个路径,联想到了树上莫队中对路径的处理。这里......
  • 数据结构(C++版)——顺序表
    一、顺序表有关的基本操作1、InitList(&L):初始化线性表,构造一个空的线性表L2、DestroyList(&L):销毁线性表L3、ClearList(&L):将线性表L重置为空表4、ListEmpty(L):若L为空表,则返回TURE,否则返回FALSE5、GetElem(L,i,&e):用e返回L中第i个数据元素的值6、LocateElem(L,e):在线性......
  • C++八股文——内存管理(堆和栈的区别? C++内存分区? 内存泄漏?如何避免?什么是智能指针?有哪
    文章目录C++内存管理堆和栈的区别C++内存分区内存泄漏?如何避免?1、什么是内存泄露?2、内存泄漏的分类3、什么操作会导致内存泄露?4、如何防⽌内存泄露?5、智能指针有了解哪些?6、构造函数,析构函数要设为虚函数吗,为什么?什么是智能指针?有哪些种类?new和malloc有什么区别?d......
  • C++智能指针讨论
    一段有问题的代码。#include<iostream>intmain(){for(inti=0;i<10000000;i++){double*p=newdouble(1);}return0;}这里就有了内存泄漏。修改为下边的代码,是可以的,但是会比较占用CPU资源。#include<iostream>intmain()......
  • C++速览之智能指针
    1、存在的问题c++把内存的控制权对程序员开放,让程序显式的控制内存,这样能够快速的定位到占用的内存,完成释放的工作。但是此举经常会引发一些问题,比如忘记释放内存。由于内存没有得到及时的回收、重复利用,所以在一些c++程序中,常会遇到程序突然退出、占用内存越来越多,最后不......