【Educoder作业】C&C++控制结构实训
按照道理来讲,学完了这节课,在学一个函数学一个递归,你就能去参加 W o r l d F i n a l World\ Final World Final了…
T1 分支结构:是闰年吗
很简单,闰年就两种, 400 400 400的倍数或者 4 4 4倍数但不是 100 100 100的倍数。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int year;
// 请在此添加代码,判断输入的年份是否位闰年,是则输出"Yes",否则输出"No"
/********** Begin *********/
cin >> year;
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) puts("Yes");
else puts("No");
/********** End **********/
return 0;
}
T2 分支结构:一年中的第几天
这个题的话,我们可以稍微处理的巧妙一点。总体思想是,把这个月之前的天数加起来,然后加上现在是这个月第几天即可。
对于 2 2 2月的处理,我们可以用一个 t t t来让操作普适化。比如闰年 t t t就是 1 1 1,否则 t t t就是 0 0 0,这样在加的时候就不需要再判了。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
// y-年,m-月,d-日,n-第几天
int y, m, d, n;
// 请在此添加代码,计算并输出指定日期是第几天
/********** Begin *********/
cin >> y >> m >> d ;
int t = (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0);
n = 0;
for (int i = 1; i < m; i ++ ) {
if (i == 2) n += 28 + t;
else if (i == 4 || i == 6 || i == 9 || i == 11) n += 30;
else n += 31;
}
n += d;
/********** End **********/
printf("%d-%d-%d是第%d天\n",y,m,d,n);
return 0;
}
T3 分支结构:重排最大数
咳咳,我用了个 s o r t sort sort,不然的话就六个判断,一共 3 ! 3! 3!种情况。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
// n-输入的数,m-重排后的数
int n, m;
// 请在此添加代码,输入一个小于1000的正整数,重排出最大的数存入m中
/********** Begin *********/
cin >> n ;
int a[3];
a[0] = n / 100;
a[1] = n / 10 - a[0] * 10;
a[2] = n % 10;
sort(a, a + 3);
m = a[2] * 100 + a[1] * 10 + a[0];
/********** End **********/
// 输出重排后的数
cout << m << endl;
return 0;
}
T4 循环结构:黑洞陷阱
跟上个题没啥区别,只是需要用到 w h i l e while while循环。注意一下退出条件和计数器即可。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
// 请在此添加代码,输出整数进入黑洞过程
/********** Begin *********/
cin >> n ;
int t = 1;
while (n != 495) {
int mdl = n, a[3];
a[0] = mdl / 100;
a[1] = mdl / 10 - a[0] * 10;
a[2] = mdl % 10;
sort(a, a + 3);
printf("%d:%d-%d=%d\n", t, a[2] * 100 + a[1] * 10 + a[0], a[0] * 100 + a[1] * 10 + a[2], (a[2] - a[0]) * 99);
n = (a[2] - a[0]) * 99;
t ++ ;
}
/********** End **********/
return 0;
}
T5 循环结构:是素数吗
只需要用最低效的方法就行了,从 2 2 2到 n − 1 n-1 n−1,如果有能整除他的就不是素数。
稍微优化一下,比如只需要从 2 2 2判断到 n \sqrt n n即可,因为如果有一个大于 n \sqrt n n的数 x x x满足 ∃ y \exist y ∃y使得 x y = n xy=n xy=n,那么 y = n x y=\frac n x y=xn一定是小于 n \sqrt n n的,也就是可以被判断出来。
当然,还有相当快的算法 M i l l a r − R a b i n Millar-Rabin Millar−Rabin。简单来说就是基于二进制快速乘和费马小定理的一种已知最快的判断素数的算法。但是 M R MR MR算法是基于随机数的,所以其常数可能会影响准确性,对于初学者难以理解,不过多介绍。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int n;
// 请在此添加代码,输入正整数n,如果n是素数则输出“Yes”,否则输出“No”
/********** Begin *********/
cin >> n;
if (n == 1) {
puts("No");
return 0;
}
if (n == 2) {
puts("Yes");
return 0;
}
for (int i = 2; i < n; i ++ ) {
if (n % i == 0) {
puts("No");
return 0;
}
}
puts("Yes");
/********** End **********/
return 0;
}
T6 循环结构:素数和
更没啥了,一个循环的事儿。
// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int n, k;
// 请在此添加代码,输入n和k,并输出n以内k个素数以及它们的和
/********** Begin *********/
cin >> n >> k;
int sum = 0;
for (int i = n; i; i -- ) {
bool flag = true;
for (int j = 2; j < i; j ++ ) if (i % j == 0) flag = false;
if (flag && i != 1) {
sum += i;
cout << i << ' ' ;
k -- ;
if (!k) {
cout << sum << endl ;
return 0;
}
}
}
cout << sum << endl ;
return 0;
/********** End **********/
return 0;
}