第一题
这个题目相信大家都很熟悉了,本质上和之前做过的计算某个时间段之间有多少天没有区别,思路是一样的,可以参考第三次上机 那一篇的最后一题计算天数,最后计算对7取余的余数是多少即可
#include <iostream>
using namespace std;
int main()
{
int year, month, day, num;
cin >> year >> month >> day;
/* 计算因为年份多出来的天数 */
for (int i = 2000; i <= year - 1; i++) {
day += 365;
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
day += 1; // 闰年多加1天
}
}
/* 计算因为月份多出来的天数 */
for (int i = 1; i <= month - 1; i++) {
if (i == 2) {
day += 28; // 平年2月有28天
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
day += 1; // 闰年2月多加一天
}
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
day += 30; // 4 6 9 11月份
} else {
day += 31; // 其他月份 即1 3 5 7 8 10 12
}
}
num = (day + 4) % 7 + 1;
cout << "星期" << num << endl;
return 0;
}
第二题
这个需要注意题目说的aaaa
指的就是比如8888这种数字,而不是指a
的4次方,理解了题目的意思之后就可以一个双层循环解决问题了,外层循环负责相加,内层循环获取当前需要增加的数字
#include<iostream>
using namespace std;
int main()
{
int n, a, sum, a_n = 0;
cin >> a >> n;
for (int i=1; i<=n; i++) {
a_n = a_n * 10 + a;
sum += a_n;
}
cout << sum << endl;
return 0;
}
第三题
这个算是很经典的循环题目 了,可以使用数组来依次存储每一项数列元素的值,但是也可以只用三个变量来完成计算,注意看, 斐波那契数列只需要前面两项元素的值就可以得出当前元素,所以每次实际上我们需要保存的就只有两个变量的值即可,具体操作可以参考下面的代码
#include<iostream>
using namespace std;
int main()
{
int n;
long long f_n = 1, a = 0, b = 1;
cin >> n;
for (int i=2; i<=n; i++) {
f_n = a + b;
a = b;
b = f_n;
}
cout << f_n << endl;
return 0;
}
第四题
这个题目其实就是很简单的循环,每一步计算的结果作为参数进行下一步计算即可,另外关于数位和这个问题也在之前的题目的中有讲过,就不再重复了
#include <iostream>
using namespace std;
int main(void) {
int n, f_n;
cin >> n;
for(int i=0; i < 10; i++) {
f_n = 0;
while (n != 0) {
f_n += n % 10;
n /= 10;
}
n = f_n;
}
cout << f_n << endl;
return 0;
}
第五题
这个题目其实不算难,主要是思路要清楚,最小公倍数是怎么求的大家高中应该学过。
- 首先是计算最大公约数gcd。
- 随后将原本的两个数a,b除以gcd,这样可以得到两个互质的数字c和d,那么他们的积就是c和d的最小公倍数。
- 最后乘回之前的gcd即可得到目标数字
思路有了之后就是计算就可,之前也有过求gcd的题目,所以算法就不再重复了
#include<iostream>
using namespace std;
int main()
{
int a, b, r;
cin >> a >> b;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
cout << a << endl;
return 0;
}
第六题
这题没有啥好的办法,就是强行计算就好了注意一下rev(1)=1
,不要弄成rev(1)=1000
这种就好
#include<iostream>
using namespace std;
int main()
{
int n, counter = 0;
cin >> n;
for (int i=1; i<n; i++) {
int rev = 0, x = i;
while(x > 0) {
rev = rev * 10 + x % 10;
x /= 10;
}
if (rev + i == n) {
counter++;
// cout << i << endl;
}
}
cout << counter << endl;
return 0;
}
第七题
这个题目其实主要是有些语法上的问题,另外由于精度限制,除法的时候注意要写为小数除法(等式两边存在小数的时候编译器会自动转为小数除法),不然如果除号两边都是整数的话计算结果也会转化为整数,这样就会损失精度了。最后有个简单的再循环中可能要注意变量初始化的问题,其实由于计算的结果是可以继承的,里面那个for循环省略掉都没啥,不过那样要改的就有点多了
// 请在下方添加代码
/********** Begin *********/
#include<iostream>
#include<iomanip>
using namespace
std;
const double EPS = 1E-6;
int main() {
int i, n, item; /* item 可以是long long类型 */
double e;
e = 1;
n = 1;
// item = 1;
do {
item = 1; /* 放到循环里面 */
for (i = 1; i <= n; i++)
item *= i;
// e += 1 / item;
e += 1.0 / item; /* 应该是小数除法 */
n++;
} while (1.0 / item >= EPS);
// cout <<”e =”<<fixed << setprecision(6) << e << endl;
cout <<"e ="<<fixed << setprecision(6) << e << endl; /* 应该使用英文分号 */
return 0;
}
/********** End **********/
第八题
这个题目其实简化很多了,首先都是1磅重,那么就只需要选价值最高的几样物品即可,另外由于价值直接等于i,所以其实连循环都不用,直接计算等差数列和即可,感兴趣的同学可以自己搜索0-1背包问题
深入下,提前学习动态规范方面的知识
#include<iostream>
using namespace std;
int main()
{
int n, W, max_val = 0;
cin >> n >> W;
for(int i=0; i<W; i++) {
max_val += n;
n--;
}
cout << max_val << endl;
return 0;
}