写在前面的话:做算法实在太需要毅力和耐心了,希望每一学算法的伙伴们都能一直坚持下去,浙江大学翁凯老师曾说过:所有计算机程序都是人为设计出来的,既然别人能做到,那你也能做到。
今天我要分享的是我记录刷题的每一天,希望有一天回头看时,感慨这一路的艰辛。从今天开始,从算法题中领悟吧。
1.韩信点兵
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人
一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组
数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<
7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件
结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
代码:
#include <iostream>
using namespace std;
int main() {
int a, b, c;
while (cin >> a >> b >> c) {
// 尝试从10开始,依次递增尝试
for (int x = 10; x <= 100; ++x) {
if (x % 3 == a && x % 5 == b && x % 7 == c) {
cout << x << endl; // 输出找到的结果
break; // 找到一个符合条件的结果就退出循环
}
// 如果遍历完仍未找到符合条件的结果,报告无解
if (x == 100) {
cout << "No answer" << endl;
}
}
}
return 0;
}
2.倒三角
输入正整数n≤20,输出一个n层的倒三角形。例如,n=5时输出如下:
#########
#######
#####
###
#
这题比较简单,循环嵌套即可。
代码:
int main(){
int n ;
cin >> n; // 层数
if (n <= 20)
{
for (int i = n; i > 0; --i) {
int k = 2 * i - 1;
for(int j = 0 ; j < n - i; ++j){
cout << " ";
}
for (; k > 0; --k) {
cout << "#";
}
cout << "\n";
}
}
}
3.子序列之和
输入两个正整数n<m<106,输出 ,保留5位小数。输入包含多组数据,
结束标记为n=m=0。提示:本题有陷阱。
样例输入:
2 4
65536 655360
0 0
样例输出:
Case 1: 0.42361
Case 2: 0.00001
这题也算是一道简单题吧。
//子序列之和
int main(){
long long n , m;
double sum = 0;
while(cin >> n >> m){
if (n == 0 && m == 0){
printf("%.5f",sum);
break;
}
for(long long i = n; i <= m; i++){
sum += 1.0 / (i*i);
}
}
return 0;
}
路漫漫其修远兮,吾将上下而求索……