【数据结构与算法】学习笔记-《算法笔记》-5

cin / cout

  • 使用cin / cout 需要添加头文件#include以及 using namespace std;
  • 同时读入多个变量:cin>>n>>db>>c>>str;
  • 读入一整行(使用getline函数):
char str[100];
cin.getline(str, 100)
  • 如果是string容器,则需要用下面的方式输入:
	string str;
	getline(cin, str);
  • 对cout来说,换行有两种方式:"\n"或者使用endl;
  • 如果想要控制double型的精度,需要加上#include<iomanip>头文件
    输出示例:cout << setiosflags(ios::fixed) << setprecision << 123.4567 << endl;

浮点数的比较

  • 浮点数在计算机中的存储并不总是精确的,需要引入一个极小数eps来对这种误差进行修正;
	const double eps = 1e-8;
  • 等于运算符
    #define Equ(a,b) (((fabs)((a)-(b)))<(eps))
    Eg
#include <cstdio>
#include <cstring>
#include<cmath>
const double eps = 1e-45;
#define Equ(a,b) (((fabs)((a)-(b)))<(eps))

int main() 
{ 
	double db = 1.23;
	for (int i = 1; i <= 20; i++)
	{
		if (Equ(db, 1.23))	printf("true");
		else	printf("false");
	}
	return 0;
}

如果写成db==1.23在这种简单的情况下没有问题,如果是进行误差较大的运算后,精度的损失就不可忽视了。

  • 大于运算符
#define More(a,b) (((a)-(b))>(eps))
  • 小于运算符
#define Less(a,b) (((a)-(b))<(-eps))
  • 大于等于运算符
#define MoreEqu(a,b) (((a)-(b))>(-eps))
  • 小于等于运算符
#define Less(a,b) (((a)-(b))<(eps))
  • 圆周率pi
const double Pi = acos(-1.0);

复杂度

  • 一般分为时间复杂度、空间复杂度、编码复杂度

  • 时间复杂度O(n):算法需要执行基本运算的次数所处的等级
    O(n)与O(2n)是等价的:消耗的时间随规模n的增大而线性增长
    高等级的幂次会覆盖低等级的幂次O(3n2+n+2)=O(3n2)=O(n2)
    显然O(3n2+n+2)会趋向于O(cn2),c称为时间复杂度的常数
    还有各种各样的时间复杂度,如二分查找的时间复杂度为O(logn),表示对数的时间复杂度;常数复杂度O(1)则表示算法消耗的时间不随规模的增长而增长。
    O(1)<O(logn)< O(n)<O(n2)

  • 空间复杂度和时间复杂度采用同样的写法,表示算法需要消耗的最大数据空间
    Eg对某个算法来说,如果其消耗的最大数据空间是一个二维数组,那么这个算法的空间复杂度就是O(n2)。由于空间一般足够使用,因此常用以空间换时间的策略,如散列法;

  • 编码复杂度是一个定性的概念,没有什么量化标准,冗长的算法思想会使代码量巨大

三种常见输入方式

  • while…EOF型
    题目没有给定输入的结束条件(输入完所有数据为止)
    scanf函数的返回值为其成功读入的参数的个数
    正常的控制台中的输入一般是不会失败的,只有在读取文件时达到文件末尾导致的无法读取现象,才会产生读入失败,这时候scanf函数会返回-1,且C语言中使用EOF(即End Of File)来代表-1;
    所以,当题目没有说明有多少数据需要读入时,就可以利用scanf的返回值是否为EOF来判断输入是否结束。
	while (scanf("%d", &n) != EOF)
	{
		...
	}
	//只要scanf的返回值不为EOF(文件中的数据没有读完),就反复读入n;
	//当读入失败时(达到文件末尾),结束while循环。

另外,当在控制台里输入数据时,并不会触发EOF状态,如果想在控制台手动触发EOF,可以按< Ctrl+Z>组合键,再按< Enter>键就可以结束while了
如果是读入字符串,则有scanf与gets两种方式可用

	while (scanf("%s", str) != EOF)
	{
		...
	}
	while (gets(str) != NULL)
	{
		...
	}
  • while…break型
    题目要求当输入的数据满足某个条件时停止输入
    这种类型有两种写法:
    一种是在while…EOF的内部进行判断,当满足退出条件时中断(break)当前while循环;
    另一种更简洁的写法是,把退出条件的判断放到while语句中,令其与scanf用逗号隔开,如
while (scanf("%d%d", &a, &b), a || b)
{
	...
}
  • while(T–)型
    在这种类型中,题目会给出测试数据的组数,然后才给出相应数量组数的输入数据。由于给定了测试数据的组数,因此需要用一个变量T来存储。在读入T后,进行T次循环,每次循环解决一组数据的输入与输出while (T--) {...}

三种常见输出类型

  • 正常输出
  • 每组输出后都额外加一个空行
  • 两组输出数据之间有一个空行(格),最后一组数据后面没有空行(格)
  • 在多点测试中,每一次循环都要重置一下变量和数组,否则在下一组数据来临的时候变量和数组的状态就是不是初始状态了;重置数组一般使用memset函数或者fill函数。

练习
A+B 输入输出练习I

题目描述
你的任务是计算a+b。这是为了acm初学者专门设计的题目。你肯定发现还有其他题目跟这道题的标题类似,这些问题也都是专门为初学者提供的。

输入 输入包含一系列的a和b对,通过空格隔开。一对a和b占一行。

输出 对于输入的每对a和b,你需要依次输出a、b的和。

如对于输入中的第二对a和b,在输出中它们的和应该也在第二行。

#include <cstdio>
#include <cstring>
#include<cmath>

int main() 
{ 
	int a, b;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		printf("%d\n", a + b);
	}
	return 0;
}

A+B 输入输出练习II

题目描述
你的任务是计算a+b。

输入 第一行是一个整数N,表示后面会有N行a和b,通过空格隔开。

输出 对于输入的每对a和b,你需要在相应的行输出a、b的和。 如第二对a和b,对应的和也输出在第二行。

#include "stdafx.h"
#include <cstdio>
#include <cstring>
#include<cmath>

int main() 
{ 
	int a, b, N;
	scanf("%d", &N);
	while (N--)
	{
		scanf("%d %d", &a, &b);
		printf("%d\n", a + b);
	}
	return 0;
}

A+B 输入输出练习III

题目描述
你的任务是计算a+b。

输入 输入中每行是一对a和b。其中会有一对是0和0标志着输入结束,且这一对不要计算。

输出 对于输入的每对a和b,你需要在相应的行输出a、b的和。 如第二对a和b,他们的和也输出在第二行。

	#include <cstdio>
	#include <cstring>
	#include<cmath>

	int main() 
	{ 
		int a, b;
		while (scanf("%d %d", &a, &b),a||b)
		{
			printf("%d\n", a + b);
		}
		return 0;
	}

A+B 输入输出练习IV

题目描述
你的任务是计算若干整数的和。

输入 每行的第一个数N,表示本行后面有N个数。

如果N=0时,表示输入结束,且这一行不要计算。

输出 对于每一行数据需要在相应的行输出和。

	#include <cstdio>
	#include <cstring>
	#include<cmath>

	int main() 
	{ 
		int N;
		while (scanf("%d", &N),N)
		{
			int a,sum=0;
			while (N--)
			{
				scanf("%d", &a);
				sum += a;
			}
			printf("%d\n", sum);
		}
		return 0;
	}

A+B 输入输出练习V

题目描述 你的任务是计算若干整数的和。

输入 输入的第一行是一个正数N,表示后面有N行。每一行的第一个数是M,表示本行后面还有M个数。

输出 对于每一行数据需要在相应的行输出和。

	#include <cstdio>
	#include <cstring>
	#include<cmath>

	int main() 
	{ 
		int N,M;
		scanf("%d", &N);
		while (scanf("%d", &M),N--)
		{
			int a, sum = 0;
			while (M--)
			{
				scanf("%d", &a);
				sum += a;
			}
			printf("%d\n", sum);
			if (N == 0) break;
		}
		return 0;
	}

A+B 输入输出练习VI

题目描述
你的任务是计算若干整数的和。

输入 每行的第一个数N,表示本行后面有N个数。

输出 对于每一行数据需要在相应的行输出和。

#include <cstdio>
	#include <cstring>
	#include<cmath>

	int main() 
	{ 
		int N;
		while (scanf("%d", &N)!=EOF)
		{
			int a, sum = 0;
			while (N--)
			{
				scanf("%d", &a);
				sum += a;
			}
			printf("%d\n", sum);
		}
		return 0;
	}

A+B 输入输出练习VII

题目描述
你的任务是计算两个整数的和。
输入 输入包含若干行,每行输入两个整数a和b,由空格分隔。
输出 对于每组输入,输出a和b的和,每行输出后接一个空行。

	#include <cstdio>
	#include <cstring>
	#include<cmath>

	int main() 
	{ 
		int a,b;
		while (scanf("%d %d", &a,&b)!=EOF)
		{
			printf("%d\n\n", a+b);
		}
		return 0;
	}

A+B 输入输出练习VIII

题目描述 你的任务是计算若干整数的和。 输入 输入的第一行为一个整数N,接下来N行每行先输入一个整数M,然后在同一行内输入M个整数。

输出 对于每组输入,输出M个数的和,每组输出之间输出一个空行。

#include <cstdio>
#include <cstring>
#include<cmath>

int main()
{
	int N, M;
	scanf("%d", &N);
	while (scanf("%d", &M), N--)
	{
		int a, sum = 0;
		while (M--)
		{
			scanf("%d", &a);
			sum += a;
		}
		printf("%d\n\n", sum);
		if (N == 0) break;
	}
	return 0;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 1222

猜你喜欢

转载自blog.csdn.net/weixin_42176221/article/details/99753519