排序:本质就是反复交换

1. 交换

  1. //c
  2. class temp = a; class temp = b;
  3. a = b; b = a;
  4. b = temp; a = temp;
  5. //c++
  6. #include <algorithm>
  7. swap(a,b);

2. 最值,平均

  • 最值

    • min = INF, max = -INF;
    • min = max = a[0];
  1. #define INF 100000
  2. int min = INF, max = -INF;
  3. //int min = max = a[0];
  4. if(min>x) min = x;
  5. if(max<x) max = x;
  • 平均:double sum
  1. double sum = 0;
  2. int cnt = 0;
  3. for()
  4. sum += ...
  5. cout << sum/cnt;

eg2-5 数据统计

输入一些整数,求出他们的最小值,最大值和平均值(保留三位小数),输入的数小于1000
输入包含多组数据,每组数据的第一行是整数个数n,第二行是n个整数,n=0为输入结束标记,程序应当忽略这组数据,相邻两组数据之间应输出一个空行

输入: 8
2 8 3 5 1 7 3 6
4
-4 6 10 0
0
输出 1 8 4.375
-4 10 3.000

每次运算后的数据都要进行重置,即每一轮后min,max,sum,cnt都需要被重置

  1. #define INF 100000
  2. int main()
  3. {
  4. int num;
  5. //&&num ==> num为0时退出
  6. while(scanf("%d", &num) && num){ //读入num,且num为0时退出
  7. int min = INF, max = -INF;
  8. int n;
  9. double sum = 0;
  10. int cnt = 0;
  11. for(int i=0; i<num; i++){
  12. scanf("%d", &n);
  13. if(min>n) min = n;
  14. if(max<n) max = n;
  15. sum += n;
  16. cnt++;
  17. }
  18. printf("%d %d %.3f\n", min, max, sum/cnt);
  19. }
  20. return 0;
  21. }

3. 排序

  • 选择排序
  • 冒泡排序
  • 插入排序
  1. int a, b, c;
  2. cin >> a >> b >> c;
  3. //插入排序(摸牌) 找到位置后交换(每轮只交换一次)(但也可以通过不断交换来实现)
  4. //冒泡排序 ==> 最后一个值是最大值 比我小就交换(每轮会交换很多次)
  5. if(a>b) swap(a,b);
  6. if(b>c) swap(b,c);
  7. if(a>b) swap(a,b);
  8. cout << a << " " << b << " " << c << endl;
  9. //选择排序 ==> 第一个值是最小值 找到最小值后交换(每轮只交换一次)

~是按位取反

scanf的返回值是输入值的个数

如果没有输入值就是返回-1

-1按位取反结果是0

while(~scanf(“%d”, &n))就是当没有输入的时候退出循环

=======================================
范围问题

  1. 3n+1
  2. 阶乘的和 (*)