数字统计

P2550 [AHOI2001] 彩票摇奖
#include <iostream>using namespace std;int main(){/*223 31 1 14 19 17 1812 8 9 23 1 16 711 7 10 21 2 9 31*/int n, ac_num[7] ={0}, zj_num[7] = {0};cin >> n;// 读入中奖号码for(int i = 0 ;i <7 ; i++){cin >> ac_num[i];}// 兑奖 ,假设只买了一张for(int m = 0; m < n ; m++){int cnt = 0;for(int j = 0; j < 7; j ++ ){int x;cin >> x; // 12for( int k = 0; k < 7 ; k++){if(x == ac_num[k]){// 该数字为中奖号码。cnt ++;}}}// 保存当前这张彩票的中奖情况zj_num[cnt] ++;}cout << zj_num[6] << " ";for(int i = 7-1; i >=1 ; i--){cout << zj_num[i] << " ";}return 0;}
旗鼓相当的对手
我们可以定义四个数组,分别代表语,数,外,总分,然后统计即可。
注意统计的时候要用双重循环,因为每一个学生都要和其他所有学生比较。
代码(一维数组解法):
#include<bits/stdc++.h>using namespace std;int chi[1005],mat[1005],eng[1005],tot[1005];int ans=0;int main(){int n;cin>>n;for(int i=1;i<=n;++i){cin>>chi[i]>>mat[i]>>eng[i];tot[i]=chi[i]+mat[i]+eng[i]; //计算总分}for(int i=1;i<=n;i++){//不要计算自己,和其他同学比for(int j=i+1;j<=n;j++){if((abs(chi[i]-chi[j])<=5)&&(abs(mat[i]-mat[j])<=5)&&(abs(eng[i]-eng[j])<=5)&&(abs(tot[i]-tot[j])<=10))ans++;//一个一个判断}}cout<<ans;return 0;}
扩展: 桶排序
U230565 桶排序 https://www.luogu.com.cn/problem/U230565

杨辉三角:
10大神秘特性
#include <stdio.h>#define N 14void main(){int i, j, k, n=0, a[N][N]; /*定义二维数组a[14][14]*/while(n<=0||n>=13){ /*控制打印的行数不要太大,过大会造成显示不规范*/printf("请输入要打印的行数:");scanf("%d",&n);}printf("%d行杨辉三角如下:\n",n);for(i=1;i<=n;i++)a[i][1] = a[i][i] = 1; /*两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数*/for(i=3;i<=n;i++)for(j=2;j<=i-1;j++)a[i][j]=a[i-1][j-1]+a[i-1][j]; /*除两边的数外都等于上两顶数之和*/for(i=1;i<=n;i++){for(k=1;k<=n-i;k++)printf(" "); /*这一行主要是在输出数之前打上空格占位,让输出的数更美观*/for(j=1;j<=i;j++) /*j<=i的原因是不输出其它的数,只输出我们想要的数*/printf("%6d",a[i][j]);printf("\n"); /*当一行输出完以后换行继续下一行的输出*/}printf("\n");}
c++ 实现
#include <iostream>using namespace std;int main(){int n ; // < 13cin >> n ;int arr[14][14] = {0};for(int i = 1;i<=n; i++){arr[i][1] = 1;arr[i][i] = 1;}for(int i = 3; i <= n; i++){for(int j = 2; j <= i-1;j++){arr[i][j] = arr[i-1][j] + arr[i-1][j-1];}}for(int i = 1; i <= n; i++){for(int j = 1; j <= i;j++){cout << arr[i][j] << " ";}cout << endl;}}
习题 5.1 梦中的统计(洛谷 P1554)
Bessie 正在数数,她从 M 数到 N,请统计 M 到 N 中每个数码
出现了几次?
例如 111 中 1 出现了 3 次,2-9 和 0 都出现了 0 次。
提示:可定义 a 数组,a[0] 表示0出现的次数,a[1] 表示 1 出现
的次数…以此类推。分离每一个数字,得到一个数字就在相应的
a 数组上 +1。
这题依然需要初始化 a 数组。

习题 5.2 珠心算测验(洛谷 P2141 NOIP2014)
给出n(n<=100)个不超过 10000 互不相同的正整数,求这些数 字中有多少个数恰好等于另外两个不同的数之和。 例如下面的例子,3=1+2,4=1+3,所以这两个数符合要求 提示:使用三重循环,第一重枚举判断各个数字,第二重和第三 重枚举剩下两个数字。这三个数字不能在相同的位置。 输入:
41 2 3 4
输出
2
标记 book[ a[i] + a[j] ] 的和为数组下标,统计过滤

习题 5.3 爱与愁的心痛(洛谷 P1614)


习题 5.6 蛇形方阵(洛谷 P5731)
题目描述
给出一个不大于 $9$ 的正整数 $n$,输出 $n\times n$ 的蛇形方阵。
从左上角填上 $1$ 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 $3$ 个字符,前面使用空格补齐。
输入格式
输入一个正整数 $n$,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例 #1
样例输入 #1
4
样例输出 #1
1 2 3 412 13 14 511 16 15 610 9 8 7
提示
数据保证,$ 1 \leq n \leq 9 $。
方向数组
方向数组
我理解的方向数组,与坐标有关系,直接看个图:
例如

你可以这样定义:
模板如下:
int map[4][2]={{-1,0},{1,0},{0,1},{0,-1}}//左 右 上 下fx=x;fy=y;//x y表当前坐标for(int i=0;i<4;i++){fx=x+map[i][0];fy=y+map[i][1];//四个方向遍历......}1234567
/*其实 map[4][2]可以拆分为:map[0][0]=-1;map[0][1]=0;map[1][0]=1;map[1][1]=0;map[2][0]=0;map[2][1]=1;map[3][0]=0;map[3][1]=-1;这样就比较容易理解了~*/12345678910
也可以定义八个方向的:
模板如下:
int spx[] = {0,1,0,-1,1,1,-1,-1};int spy[] = {1,0,-1,0,-1,1,1,-1};for(int i = 0;i <8 ;++i){//左上左下右上右下还包括相邻的int nx = x+ spx[i];int ny = y +spy[i];......}
或者
int xy[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{1,1},{-1,-1},{-1,1}};for(int i=0;i<8;i++){int nx=x+xy[i][0];int ny=y+xy[i][1];.....}
