课后作业:数组(上)
数组排序
任务描述
本关任务:输入一个正整数 n,然后再输入 n 个整数,将它们从大到小排序后输出。
程序运行示例: 输入: 5 88 55 77 44 99 输出: 99 88 77 55 44
测试说明
测试用例 1:
输入: 5 88 55 77 44 99 输出: 99 88 77 55 44
参考代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n, a[1010];
cin >> n;
for (int i=1;i<=n;i++) cin >> a[i];
for (int i=1;i<=n;i++) {
for (int j=1;j<=n-i;j++) if (a[j]<a[j+1]) {
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
for (int i=1;i<=n;i++) cout << a[i] << " \n"[i==n];
return 0;
}
黑色星期五
任务描述
本关任务:黑色星期五是指某天既是 13 号又是星期五。13 号在星期五比在其他日子少吗?为了回答这个问题,编写一个程序,计算每个月的 13 号落在周一到周日的次数。给出 n 年的一个周期,要求计算从 1900 年 1 月 1 日至 1900+n-1 年 12 月 31 日中 13 号落在周一到周日的次数,n 为正整数且不大于 400。(已知 1900 年 1 月 1 日是星期一)。
程序运行示例: 输入:20 输出:34 33 35 35 34 36 33
测试说明
测试用例1: 输入:80 输出:137 138 137 138 137 138 135
参考代码
#include <iostream>
#include <iomanip>
using namespace std;
int main(void) {
int y=1900, m=1, d=1;
int yy, mm = 12, dd = 31;
cin >> yy;
yy = 1900 + yy - 1;
int w[7] = {0,0,0,0,0,0,0};
int M[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
for (int i=0;;i=(i+1)%7) {
if (d == 13) w[i]++;
if (y == yy && m == mm && d == dd) break;
d++;
if (d > M[m] + (m==2 && ((y%4==0&&y%100!=0)||(y%400==0))))
m++, d=1;
if (m > 12) y++, m=1;
}
for (int i=0;i<7;i++) cout << w[i] << " ";
return 0;
}
删除重复数据(双数组版)
任务描述
本关任务:编写一个能删除数组中重复数据的程序。
编程要求
根据提示,在右侧编辑器补充代码,输入一组数据,“利用一个新的数组”保存其中唯一的元素出现,输出数组中元素个数(假设为n个)并按照原顺序输出所有数字的首次出现。
注意:
(1)引入第二个数组;
(2)输出数组中元素时,不再进行新的判断,只能用for(int k=0; k<n; k++) cout<<arr[k]形式;
(3)如果需要读入所有输入的整数,可以采用while(cin>>x)这种形式。其表示循环读入数据,并将其放入变量x中。当cin读不到新的数据时候,循环终止。在本地运行时候,可以通过ctrl+z结束输入,此时cin>>x结果为false。
测试说明
平台会对你编写的代码进行测试:
测试输入:1 2 3 1 2 3;
预期输出:
1 2 3
参考代码
#include <iostream>
using namespace std;
int main(void) {
int vis[1010] = {0}, arr[1010];
int n = 0;
for (int x; cin >> x;) if (vis[x]++==0) arr[n++] = x;
for (int k=0; k<n; k++) cout << arr[k] << " ";
return 0;
}