(十二)基础算法


在c++中,会涉及到一些算法,例如递归、递推、动态规划(DP)、深搜(DFS)、广搜(BFS)……今天我们要说的是一些简单的算法

数学函数

math.h(cmath)头文件

选择任意一个头文件

#include <cmath> //仅C++可用
#include <math.h> //C/C++可用

里面有很多的数学函数

  1. pow(x, y):返回 x y x^{y} xy,也就是 y y y x x x相乘
  2. sqrt(n):返回 n \sqrt{n} n ,也就是结果乘结果要等于n
  3. abs(n):返回 ∣ n ∣ \left | n \right | n,如果 n n n是负数(小于0的数),那么把这个数的负号去掉。它返回整数
  4. fabs(n):和abs(n)一样,但它可以返回浮点数
  5. rand(); :获得一个随机数(0~32767)
  6. srand(n); :设置随机数种子
  7. time(0); :获得系统时间(一个整数)
  8. srand(time(0)); :获得真正的随机数的关键,放在rand(); 之前
  9. sin(x):返回 sin ⁡ x \sin x sinx的值
  10. cos(x):返回 cos ⁡ x \cos x cosx的值
  11. tan(x):返回 tan ⁡ x \tan x tanx的值,也可以写成 sin ⁡ x ÷ cos ⁡ x \sin x \div \cos x sinx÷cosx
    不知道三角函数,点我了解一下
  12. trunc(n):给 n n n取整
  13. ceil(n):返回 ⌈ n ⌉ \left \lceil n \right \rceil n,也就是向上取整 n n n
  14. floor(n):返回 ⌊ n ⌋ \left \lfloor n \right \rfloor n,也就是向下取整 n n n
  15. round(n):四舍五入 n n n
  16. log(n):返回 lg ⁡ n \lg n lgn的值
  17. INT_MAX:返回int类型的最大存储值
  18. INT_MIN:返回int类型的最小存储值
  19. SHORT_MAX:返回short类型的最大存储值
  20. SHORT_MIN:返回short类型的最小存储值
  21. LONG_MAX:返回long类型的最大存储值
  22. LONG_MIN:返回long类型的最小存储值
  23. LONG_LONG_MAX:返回long long类型的最大存储值
  24. LONG_LONG_MIN:返回long long类型的最小存储值

float.h头文件

输入头文件#include <float.h>,里面有六个宏定义

  1. FLT_MAX:返回float类型的最大存储值
  2. FLT_MIN:返回float类型的最小存储值
  3. DBL_MAX:返回double类型的最大存储值
  4. DBL_MIN:返回double类型的最小存储值
  5. LDBL_MAX:返回long double类型的最大存储值
  6. LDBL_MIN:返回long double类型的最小存储值

拆位

拆位,就是把一个整型的数的各个位拆下来,怎么拆位呢?先从一种数学角度来说
a b c d ‾ = 1000 × a + 100 × b + 10 × c + 1 × d \overline{abcd} = 1000 \times a + 100 \times b + 10 \times c + 1 \times d abcd=1000×a+100×b+10×c+1×d
这就是在数学中拆卸位的方法,可是在c++中也有一种拆位方式

公式
个位 n ÷ 1 % 10 n \div 1 \% 10 n÷1%10 或者 n % 10 n \% 10 n%10
十位 n ÷ 10 % 10 n \div 10 \% 10 n÷10%10 或者 n ÷ 10 n \div 10 n÷10
百位 n ÷ 100 % 10 n \div 100 \% 10 n÷100%10 或者 n ÷ 100 n \div 100 n÷100
千位 n ÷ 1000 % 10 n \div 1000 \% 10 n÷1000%10 或者 n ÷ 1000 n \div 1000 n÷1000
万位 n ÷ 10000 % 10 n \div 10000 \% 10 n÷10000%10 或者 n ÷ 10000 n \div 10000 n÷10000
十万位 n ÷ 100000 % 10 n \div 100000 \% 10 n÷100000%10 或者 n ÷ 100000 n \div 100000 n÷100000

编程实现:

#include <iostream>
using namespace std; 
int main() {
	int n; 
	cin >> n; 
	int g = n/1%10; //个位
	int s = n/10%10; //十位
	int b = n/100%10; //百位
	int q = n/1000%10; //千位
	printf("%d %d %d %d", q, b, s, g); 
	return 0; 
}

拆位进阶

我们可以进化系统,不规定位数还能求和、拆位和记位总数
输入这个:

19283

会输出两行,第一行两个数分别表示这个输入的数的总位数和位和,第二行则是拆位:

5 23
1 9 2 8 3

代码:

#include <iostream>
using namespace std; 
int main() {
	int n; 
	cin >> n; 
	int cnt=0, sum=0; 
	int a[15] = {}; //使用数组存储数位 
	while(n) {
		a[cnt++] = n%10; //二合一,各数位和总位数同时记录 
		sum += n%10; //sum累加 
		n /= 10; //删除个位,十位补个位,百位补十位...... 
	} 
	cout << cnt-- << " " << sum << endl; //下标将会从长度-1开始输出 
	for(int i=cnt; i>=0; i--) {//倒排输出 
		cout << a[i] << ' '; 
	}
	return 0; 
}

奇偶判断

奇数,就是我们俗称的单数,只要它的个位是1,3,5,7,9中其中一个,它就是奇数
偶数,就是我们俗称的双数,只要它的个位是0,2,4,6,8中其中一个,它就是偶数
判断奇偶其实非常简单,判断它是否能够被2整除,能的是偶数,不能的是奇数
上代码:

#include <iostream>
using namespace std; 
int main() {
	int n; cin >> n; 
	cout << (n%2?"奇数":"偶数"); 
	return 0; 
}

质数判断

质数是什么?质数是值一个数只有1和它本身两个因数的数,合数是除了1和它本身外还有其他因数的数。另外,1既不是质数也不是合数。如何做出这种质数判断机呢?看下代码

#include <iostream>
using namespace std; 
int main() {
	unsigned n; 
	cin >> n; 
	if(n<=1) {
		cout << "既不是质数也不是合数"; 
		return 0; 
	} else {
		for(int i=2; i*i<=n; i++) {
			if(n%i==0) {
				cout << "这是合数"; 
				return 0; 
			} 
		}
	}
	cout << "这是质数"; 
	return 0; 
}

另外,可以制作封装函数(讲解敬请期待),在这里把代码发一下,只要把以下代码放在main()前面,就可以使用此函数,用法:

  1. isprime(n):判断n是不是质数,是返回1,不是返回0
  2. istotal(n):判断n是不是合数,是返回1,不是返回0
bool isprime(int n) { //判断是否为质数 
	if(n<=1) return 0;
	for(int i=2; i*i<=n; i++)
		if(n%i==0) return 0;
	return 1;
}

bool istotal(int n) { //判断是否为合数 
	if(n<=1) return 0;
	for(int i=2; i*i<=n; i++)
		if(n%i==0) return 1;
	return 0;
}

电灯

在生活中,电灯点一下亮,点一下暗,点一下又亮,点一下又暗……
而在c++中,如何实现电灯的操作呢?
先定义一个bool类型的变量light,0表示关,1表示开,那么light的变化方式就是这样的
light = 0
light = 1-light = 1-0 = 1
light = 1-light = 1-1 = 0
light = 1-light = 1-0 = 1
light = 1-light = 1-1 = 0

因此电灯的程序可以是这样的(效率高)

#include <iostream>
using namespace std; 
int main() {
	bool light = false; 
	for(int i=0; i<10; i++) {
	    light = 1-light; 
	    cout << light << ' '; 
	}
	return 0; 
}

也可以是这样的(还是高,但没有第一种高)

#include <iostream>
using namespace std; 
int main() {
	bool light = false; 
	for(int i=0; i<10; i++) {
	    if(light==false) 
	    	light = true; 
	    else
	        light = false; 
	    cout << light << ' '; 
	}
	return 0; 
}

好了,点赞,关注,散会!

  • 36
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值