6.分数统计
分数统计
作者: Turbo时间限制: 1S章节: 一维数组
问题描述 :
给定一个百分制成绩T,将其划分为如下五个等级之一:
90100为A,8089为B,7079为C,6069为D,0~59为E
现在给定的输入中包含若干百分制成绩(成绩个数不超过100),请你统计五个等级段的人数,并找出人数最多的那个等级段,按照从大到小的顺序输出该段中所有人成绩(保证人数最多的等级只有一个)。
输入说明 :
两行,第一行为n,表示将输入n个分数,
第二行为n个0~100的正整数,用空格隔开
输出说明 :
第一行为5个正整数,分别表示A,B,C,D,E五个等级段的人数
第二行一个正整数,表示人数最多的等级段中人数
接下来一行若干个用空格隔开的正整数,表示人数最多的那个等级中所有人的分数,按从大到小的顺序输出。
输入范例 :
10
100 80 85 77 55 61 82 90 71 60
输出范例 :
2 3 2 2 1
3
85 82 80
思路:肯定有更好的想法,我这搞了三个数组惭愧惭愧,但思路很简单···
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,i,a[1005];
while(cin>>n)
{
int b[6]={0},c[6]={0};
for(i=0;i<n;i++) cin>>a[i];
//int a=0,b=0,c=0,d=0,e=0;
for(i=0;i<n;i++)
{
if(a[i]>=0 && a[i]<60) b[5]++;
if(a[i]>59 && a[i]<70) b[4]++;
if(a[i]>69 && a[i]<80) b[3]++;
if(a[i]>79 && a[i]<90) b[2]++;
if(a[i]>89 && a[i]<=100) b[1]++;
}
for(int j=1;j<6;j++) c[j]=b[j];
cout<<b[1]<<" "<<b[2]<<" "<<b[3]<<" "<<b[4]<<" "<<b[5]<<endl;
sort(c,c+6,cmp);
int ans;
cout<<c[0]<<endl;
for(i=1;i<6;i++)
{
if(b[i] == c[0])
{
ans=i;
break;
}
}
sort(a,a+n,cmp);
int flag=0;
for(i=0;i<n;i++)
{
if(ans==1 && a[i] >89 && a[i]<=100)
{
if(flag!=0) cout<<" ";
cout<<a[i];
flag=1;
}
else if(ans==2 && a[i] >79 && a[i]<90)
{
if(flag!=0) cout<<" ";
cout<<a[i];
flag=1;
}
else if(ans==3 && a[i] >69 && a[i]<80)
{
if(flag!=0) cout<<" ";
cout<<a[i];
flag=1;
}
else if(ans==4 && a[i] >59 && a[i]<70)
{
if(flag!=0) cout<<" ";
cout<<a[i];
flag=1;
}
else if(ans==5 && a[i] >0 && a[i]<60)
{
if(flag!=0) cout<<" ";
cout<<a[i];
flag=1;
}
}
cout<<endl;
}
return 0;
}
7.蛇形方阵
问题描述 :
输出一个如下的n阶方阵。例如,若读入11,则输出:
输入说明 :
输入一个正整数n(n<20),表示需要输出n阶方阵。
输出说明 :
共输出n行n列,每个整数占4位,不足4位则左边补空格。
每行的最后无空格。
无多余空行。
不足左边补空格%4d,另每两个数据元素之间没有空格
思路:补空格这个操作我是真不知道这个tips;思路就是把从0开始的奇数行反过来就好啦!
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main(){
int n,k=1,i,j,temp;
int a[20][20];
cin>>n;
for(i=0;i<n;i++){ //看好!i是从0开始的;
for(j=0;j<n;j++){
a[i][j]=k; //先把数存起来;
k++;
}
if(i%2==1){ //每个奇数行都换过来;
for(j=0;j<n/2;j++){
temp=a[i][j];
a[i][j]=a[i][n-1-j];
a[i][n-1-j]=temp;
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",a[i][j]); //占四个字节;
}
cout<<endl;
}
return 0;
}
8.n层正方形
问题描述 :
编写程序,输出n层正方形图案。正方形图案最外层是第一层,每层用的数字和层数相同。
输入说明 :
正方形图案的层数n(小于等于25)。
输出说明 :
2n-1行2n-1列数据,同一行上的数据之间用一个空格分隔。
比如3层图案,最外层都是1,里面一层都是2,最里面一层只有一个数3,所以是5×5的矩形,如下:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
输入范例:
3
输出范例:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
思路:就扫描扫描扫描!一遍一遍扫!
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int main(){
int n,k,i,j;
int a[50][50];
cin>>n;
int sq=2*n-1;
k=1;
while(k<=n){ //一轮一轮的扫描
for(i=k-1;i<=sq-k;i++){
for(j=k-1;j<=sq-k;j++){
a[i][j]=k;
}
}
k++;
}
for(i=0;i<sq;i++)
for(j=0;j<sq;j++){
cout<<a[i][j];
if(j!=sq-1) cout<<" ";
else cout<<endl;
}
return 0;
}
9.二维数组右上左下遍历
总时间限制:
1000ms
内存限制:
65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
输入
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出
按遍历顺序输出每个整数。每个整数占一行。
样例输入
3 4 1 2 4 7 3 5 8 10 6 9 11 12
样例输出
1 2 3 4 5 6 7 8 9 10 11 12
#include <iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int a[101][101];
int i,j,c,r;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
for(j=0;j<n;j++){ //判断前N行的
r=0;
c=j; //r控制上,j控制往下走;
while(r<m&&c>=0) //输出的范围还是m以内;
cout<<a[r++][c--]<<" "; //只能说好家伙
}
for(i=1;i<m;i++){
r=i;
c=n-1;
while(r<m&&c>=0)
cout<<a[r++][c--]<<" ";
}
return 0;
}
10.特殊的矩阵运算
问题描述 :
输入m个方阵,方阵的元素是非0整数。对于n阶方阵A,明明现在需要进行特殊的运算。
例如:
A: 5 1 3
5 8 7
2 6 9
方阵A有两条对角线:从左上角到右下角的对角线,元素为5 8 9,以及从左下角到右上角的对角线,元素为2 8 3。
求A两条对角线元素相乘的和(对角线积),52+88+9*3=101;
求A两条对角线元素相除的和(对角线商):5/2+8/8+9/3=6。 (注意:求对角线商时用整除,所以5/2的结果为2。)
输入说明 :
输入由多组数据组成。
第一行有一个整数m,表示接下来有m组测试数据;
1
第二行有一个整数n,表示n阶方阵,0 < n < 10;
1
接下来的m行,每行有n*n个非0整数,整数间用空格分隔,每行对应一个矩阵。例如上述方阵A的输入格式为:5 1 3 5 8 7 2 6 9
1
输出说明 :
对每个矩阵,输出两个整数,表示对角线积和对角线商,用空格分隔。每个矩阵的输出结果占一行。
输入范例:
2
3
5 1 3 5 8 7 2 6 9
-2 3 2 1 2 49 22 1 2
输出范例 :
101 6
-36 2
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
int m,n,i,j,a[20][20],sum1,sum2,x1,x2;
cin>>n>>m;
while(n--)
{
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
}
//从列先开始遍历
sum1=0;sum2=0;
for(j=0;j<m;j++)
{
x1=a[j][j]; //这就是左上到右下的元素值,易找
for(i=0;i<m;i++)
{
if((m-1)==i+j)
{
x2=a[i][j];//这是左下到右上的元素
break;
}
}
sum1+=x1*x2;
sum2+=(x1/x2);
}
cout<<sum1<<" "<<sum2<<endl;
}
return 0;
}