C++ 基础知识(3)--三目运算符、随机数、水仙花例子

三目运算符

三目运算符的格式是:
<表达式1> ? <表达式2> : <表达式3>
表达式1true时执行表达式2,当表达式1false时执行表达式3

>

例子:

1
2
3
4
5
6
7
8
9
int num = 5;
// num > 5 为false,执行num--
num > 5 ? num ++ : num -- ;
cout << num << endl;

int num1 = 5;
// num1 == 5 为true,执行num1++
num1 == 5 ? num1 ++ : num1 -- ;
cout << num1 << endl;

运行结果:

1
2
4
6

c++ 中的三目运算符可以变量赋值
例子:

1
2
3
4
5
6
7
8
9
int a = 0;
int b = 0;
// 此时a<=b 为true,所以给a赋值1
(a<=b ? a : b) = 1;
cout << a << endl;

// 此时a<=b false,所以给b赋值2
(a<=b ? a : b) = 2;
cout << b << endl;

运行结果:

1
2
1
2

随机数

c++ 的随机数生成方式是rand()srand()
rand并不是真随机数,而是伪随机数。

rand()

使用rand()会获取到一个随机数,使用rand()是需要加上头文件#include <stdlib.h>的。取值范围是0~2147483647
例子:

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <stdlib.h>

using namespace std;

int main(){
cout << rand() << endl;
return 0;
}

打印结果:

1
16807

注意: 只有第一次运行的时候才会随机,比如这次案例执行的结果是16807,你之后的在怎么运行都还是16807。原因是没有随机种子,所有需要用到srand()

srand()

初始化随机数发生器。srand需要生成一个整数,而且保证每次这个整数都不一样才行,否则每次生成的随机数会是一样的。

1
2
unsigned int seed;
srand(seed);

也就是要保证seed每次都是不一样的才能才产生随机数。可以使用当前时钟作为随机数种子,这里要用到time(),需要用到头文件time.h
完整例子如下:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main(){
srand((unsigned int) time(NULL));
cout << rand() << endl;
return 0;
}

这样运行就会出现不同的随机数。

选择随机数产生的范围

要取得 [a,b) 的随机整数,使用 (rand() % (b-a))+ a;

要取得 [a,b] 的随机整数,使用 (rand() % (b-a+1))+ a;

要取得 (a,b] 的随机整数,使用 (rand() % (b-a))+ a + 1;

通用公式: a + rand() % n;其中的 a 是起始值,n 是整数的范围。

要取得 a 到 b 之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)

要取得 0~1 之间的浮点数,可以使用 rand() / double(RAND_MAX)

例子:

  • 获取[0,10)的范围
    rand() % 10

水仙花例子

水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。例如:1^3 + 5^3+ 3^3 = 153
找到所有三位数的水仙花数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>

using namespace std;

int main(){
for(int num =100;num<1000;num++){
int a = pow(num / 100,3);
int b = pow(num / 10 % 10,3);
int c = pow(num % 10,3);
if(a+b+c == num){
cout<<num<<endl;
}
}
return 0;
}

这个例子中用到了pow()方法,就是求数的次幂(n^m),第一次参数就是n,第二个参数就是m,m是几代表几次幂。需要头文件cmath
例子:

1
2
pow(5,2);  // 5 * 5 = 25
pow(5,3); // 5 * 5 * 5 = 125