一.C++竞赛:
1.2021
最大公约数(采用辗转相除法)
int gcd(int a, int b, int c) {
return gcd(gcd(a, b), c);
}求三个的最大公约数
返回最小公倍数:
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
#include<iostream> using namespace std; int gcd(int a, int b) { int c = 0; while (b != 0) { c = a % b; a = b; b = c; } return a; } int gcd(int a, int b, int c) { return gcd(gcd(a, b), c); } int main() { int a, b; cin >> a >> b; int ans = gcd(a, b);//函数调用 cout << ans << endl; return 0; }2.2022
最基础for循环,看见分数记得double以及1.0
#include<bits/stdc++.h> using namespace std; int main() { double m, s = 0; cin >> m; int i = 1; while (m>s) { s += 1.0 / i; i++; } cout << i - 1 << endl; return 0; }3.2023
-0x3f3f3f3f是-10亿
#include<iostream> using namespace std; int main() { double x, s = 0, n = 0, maxx = -0x3f3f3f3f, minx = 1000; while (cin >> x) { if (x > maxx) maxx = x; if (x < minx) minx = x; s += x; n++; } cout << minx << " " << maxx << " "; printf("%.3lf", s / n); return 0; }4.1086
分辨奇偶,然后计算
#include<iostream> using namespace std; int main() { int n; cin >> n; while (n != 1) { if (n % 2 == 1) { cout << n << "*3+1=" << (n = n * 3 + 1) << endl; } else { cout << n << "/2=" << (n = n / 2) << endl; } } cout << "End" << endl; return 0; }5.1087
注意i-1和double这种细节问题
#include<iostream> using namespace std; int main() { int k; cin >> k; double s = 0; int i = 1; while (k>=s) { s += 1.0 / i; i++; } cout << i-1 << endl; return 0; }6.1088(分离整数)
从低位到高位分离整数,采用先求余再整除,while循环
#include<iostream> using namespace std; int main() { int n; cin >> n; while (n) { cout << n % 10 << " "; n /= 10; } return 0; }7.1089(反转整数)
分离整数的高阶用法,采用ans*10+n%10的小技巧,反转整数
#include<iostream> using namespace std; int main() { int n; cin >> n; int ans = 0; while (n) { ans = ans * 10 + n % 10; n /= 10; } cout << ans << endl; return 0; }8.阶乘和(循环嵌套)
#include<iostream> using namespace std; int main() { int n; cin >> n; long long sum = 0; for (int x = 1; x <= n; x++) { long long ans = 1; for (int i = 1; i <= x; i++) { ans *= i; } sum += ans; } cout << sum <<endl; return 0; }9.三角形(阶乘的运用)
#include<iostream> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <=n; i++) { for (int j = 1; j<= i; j++) { cout << "*" ; } cout << endl; } return 0; }10.2028
百钱买百鸡,采用二重循环,第三重循环可优化省略,满足条件即可输出
#include<iostream> using namespace std; int main() { for (int a = 0; a <= 20; a++) { for (int b = 0; b <= 33; b++) { int c = 100 - a - b; if (c >= 0 && c % 3 == 0 && (5 * a + 3 * b + c / 3 == 100)) { cout << a << " " << b << " " <<c<< endl; } } } return 0; }11.2029
整数取各自位数上数字的应用,多说无益,自看
#include<iostream> using namespace std; int main() { for (int i = 100; i <= 999; i++) { int a = i / 100; int b = i / 10 % 10; int c = i % 10; if (a * a * a + b * b * b + c * c * c == i) { cout << i << endl; } } return 0; }12.2030(找素数(质数))
素数的标准找法,记住,头文件#include<cmath>也不能忘
#include<iostream> #include<cmath> using namespace std; bool isPrime(int x) { if (x < 2) return false; for (int i = 2; i <= sqrt(x); i++) { if (x % i == 0) return false; } return true; } int main() { int a, b; cin >> a >> b; for (int i = a; i <= b; i++) { if (isPrime(i)) cout << i << endl; } return 0; }13.2031
1000到10000的aabb整数寻找,采用了整数分离和优化算法,利用开方,极大的缩减了寻找范围,需记住这种算法
#include<iostream> #include<cmath> using namespace std; int main() { int sqrtlow = ceil(sqrt(1000)), sqrtHigh = sqrt(10000); for (int i = sqrtlow; i < sqrtHigh; i++) { int a = i * i / 1000, b = i * i / 100 % 10, c = i * i / 10 % 10, d = i * i % 10; if (a == b && c == d) { cout << i * i << endl; } } return 0; }14.2032
分解质因数,for循环和while循环的结合,没有提前判定素数,我认为应该是觉得没必要,从2开始,绝大部分能被除开,最多到5或7那一层,4和6基本被2pass了,所以不用担心,还要注意题目的输出格式,使用了标记法,很巧妙的一个题
#include<iostream> #include<cmath> using namespace std; int main() { int x; cin >> x; int first = 0; cout << x << "="; for (int i = 2; i <= x; i++) { while (x % i == 0) { if (first == 0) { cout << i; first = 1; } else { cout << "*" << i; } x /= i; } } return 0; }15.2033
阶乘的计算量过于庞大,采用模运算,防止溢出
#include<iostream> #include<cmath> using namespace std; int main() { int n; cin >> n; long long sum = 0, ans = 1, m = 1000000; for (int i = 1; i <= n; i++) { ans *= i % m; ans %= m; sum += ans % m; sum %= m; } cout << sum << endl; return 0; }16.1092
阶乘的分数相加,依旧注意double和1.0的浮点型
#include<iostream> #include<cmath> using namespace std; int main() { int n; cin >> n; double sum = 1; long long ans = 1; for (int i = 1; i <= n; i++) { ans *= i; sum += 1.0/ans ; } printf("%.10lf", sum); return 0; }17.1093
ans的值是一直在变大的,它的大小一直在随着循环乘,没有重置,维持这个思想,阶乘的题迎刃而解
#include<iostream> #include<cmath> using namespace std; int main() { int n; double x ,sum=1; cin >> n >> x; double ans = 1; for (int i = 1; i <= n; i++) { ans *= x; sum += ans ; } printf("%.2lf", sum); return 0; }18.
二.python项目基础:
三.计算机网络基础: