洛谷题单代码参考【入门3 循环结构】
- 找最小值
- 分类平均
- 一尺之棰
- 数字直角三角形
- 阶乘之和【普及题,高精度算法–>大整数乘法和加法的运用】
- 计数问题
- 级数求和
- 金币
- 数列求和
- 质数口袋 (普及题)
- 回文质数(普及题)
- 小玉在游泳
- 数字反转
- 月落乌啼算钱(斐波那契数列)
- 求极差/最大跨度值
- 最长连号
- 质因数分解
- 求三角形
- 打分(普及题)
- Davor
- 津津的存储计划
#include <iostream>
using namespace std;
int num[1005] = {1001};
int main(){
int n, nMin = 1001;
cin >> n;
for(int i = 0; i < n; i++){
cin >> num[i];
nMin = min(nMin, num[i]);
}
cout << nMin << endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n, k, countA = 0, countB = 0;
double A = 0.0, B = 0.0;
cin >> n >> k;
for(int i = 1; i <= n; i++){
if(i % k == 0){
A += i;
++countA;
} else {
B += i;
++countB;
}
}
cout << fixed << setprecision(1) << A / countA << " " << B / countB << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n, day = 1;
cin >> n;
while(n > 1){
n /= 2;
++day;
}
cout << day << endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
int n, num = 1;
cin >> n;
for(int i = 0; i < n; i++){
for(int j = 0; j < n - i; j++){
if(num < 10){
cout << 0 << num++;
} else {
cout << num++;
}
}
cout << endl;
}
return 0;
}
5.题解注意看注释,这里建议先了解一下高精度算法
#include <iostream>
using namespace std;
int num[105] = {0}, ans[205] = {0};
int main(){
int n, temp = 0, digit = 0;
cin >> n;
num[105] = ans[105] = 1;
for(int i = 2; i <= n; i++){ //控制循环层数,也就是阶乘数
for(int j = 105; j >= 0; j--){//高精度乘法,倒存,105位够了
num[j] = num[j] * i + temp;
temp = num[j] / 10; //直接取需要进位的数
num[j] = num[j] % 10; //进位后剩下最后一个个位数
}
temp = 0;
for(int j = 105; j >= 0; j--){//高精度加法,阶乘数相加
ans[j] += num[j] + temp;
temp = ans[j] / 10;
ans[j] = ans[j] % 10;
}
}
//输出的处理
for(int j = 0; j <= 105; j++){//因为ans是倒存的,所以要算出非零到哪一位
if(ans[j] != 0){
digit = j;
break;
}
}
for(int i = digit; i <= 105; i++){
cout << ans[i];
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
int k, i = 0;
double sumN = 0;
cin >> k;
while(sumN <= k){
++i;
sumN = 1.0 / i + sumN;
}
cout << i << endl;
}
#include <iostream>
using namespace std;
int main(){
int k, i = 0;
double sumN = 0;
cin >> k;
while(sumN <= k){
++i;
sumN = 1.0 / i + sumN;
}
cout << i << endl;
}
#include <iostream>
using namespace std;
int main(){
int k, gold = 0;
cin >> k;
for(int i = 1; i <= k; i++){//控制是当天是i枚金币
for(int j = 0; j < i; j++){//控制i枚金币的天数
gold += i;
--k;
}
}
cout << gold << endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
int n, sumN = 0;
cin >> n;
for(int i = 1; i <= n; i++){
sumN += i;
}
cout << sumN << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int prime[10005] = {0};
int isPrime(int n){
if(n == 2 || n == 3){
return 1;
} else if((n == 1) || ((n % 6 != 1) && (n % 6 != 5))){
return 0;
}
for(int i = 5; i <= sqrt(n); i += 6){
if((n % i == 0) || (n % (i + 2) == 0)){
return 0;
}
}
return 1;
}
int main(){
int L, sumP = 0, countP = 0;
cin >> L;
for(int i = 2, j = 0; sumP + i <= L; i++){
if(isPrime(i)){
prime[j++] = i;
sumP += i;
++countP;
}
}
for(int i = 0; prime[i] != 0; i++){
cout << prime[i] << endl;
}
cout << countP << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
//b<=10000000这个判断条件来自:除了11以外,一个数的位数是偶数的话,不可能为回文数素数。
//如果一个回文素数的位数是偶数,则它的奇数位上的数字和与偶数位上的数字和必然相等;
//根据数的整除性理论,容易判断这样的数肯定能被11整除,所以它就不可能是素数。
int isPrime(int n);
int isBack(int n);
int main(){
int a, b, pcount = 0, bcount = 0;
cin >> a >> b;
b = b >= 10000000 ? 9999999 : b;
for(int i = a; i <= b; i++){
if(isBack(i) && isPrime(i)){
cout << i << endl;
}
}
return 0;
}
int isPrime(int n){
if(n == 2 || n == 3){
return 1;
} else if((n == 1) || (n % 6 != 1 && n % 6 != 5)){
return 0;
}
for(int i = 5; i <= sqrt(n); i += 6){
if((n % i == 0) || (n % (i + 2) == 0)){
return 0;
}
}
return 1;
}
int isBack(int n){
int temp = n, num = 0;
while(temp > 0){
num = num * 10 + temp % 10;
temp /= 10;
}
return num == n ? 1: 0;
}
#include <iostream>
using namespace std;
int main(){
int step = 1;
double m, yuM = 2.0, temp = 2.0;
cin >> m;
while(yuM < m){
temp = temp * 0.98;
yuM += temp;
++step;
}
cout << step << endl;
return 0;
}
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
long long num = 0;
int n, isFlag = 0, temp = 0;
cin >> n;
while(!isFlag && (n != 0)){
if(n % 10 == 0){
n /= 10;
} else{
isFlag = 1;
}
}
isFlag = n >= 0 ? 1 : 0; //判断n是正数还是复数
temp = abs(n);
while(temp > 0){
num = num * 10 + temp % 10;
temp /= 10;
}
if(isFlag){
cout << num << endl;
} else {
cout << -num << endl;
}
return 0;
}
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main(){
int n;
double fn = 0.0;
cin >> n;
fn = (pow(((1+sqrt(5)) / 2), n) - pow(((1-sqrt(5)) / 2), n)) / sqrt(5);
cout << fixed << setprecision(2) << fn << endl;
return 0;
}
#include <iostream>
using namespace std;
int ans[1005] = {0};
int main(){
int n, maxN = -1, minN = 1001;
cin >> n;
for(int i = 0; i < n; i++){
cin >> ans[i];
maxN = max(maxN, ans[i]);
minN = min(minN, ans[i]);
}
cout << maxN - minN << endl;
return 0;
}
#include <iostream>
using namespace std;
int ans[100005];
int main(){
int n, step = 1, maxStep = 1;
cin >> n;
for(int i = 0; i < n; i++){
cin >> ans[i];
}
for(int i = 0; ans[i]; i++){
if(ans[i] + 1 == ans[i + 1]){
++step;
} else {
step = 1;
}
maxStep = max(step, maxStep);
}
cout << maxStep << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int isPrime(int n);
int main(){
int n, maxPrime = 0;
cin >> n;
for(int i = 2; i <= n; i++){
if(isPrime(i)){
for(int j = 2; j <= n; j++){
if((i * j == n) && isPrime(j)){
maxPrime = i > j ? i : j;
}
}
}
}
cout << maxPrime << endl;
return 0;
}
int isPrime(int n){
if(n == 2 || n == 3){
return 1;
} else if((n == 1) || ((n % 6 != 1) && (n % 6 != 6))){
return 0;
}
for(int i = 5; i <= sqrt(n); i += 6){
if(n % i == 0 || n % (i + 2) == 0){
return 0;
}
}
return 1;
}
#include <iostream>
using namespace std;
int main(){
int n, num = 1;
cin >> n;
//打印正方形
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(num < 10){
cout << 0 << num++;
} else {
cout << num++;
}
}
cout << endl;
}
cout << endl;
num = 1;
//打印三角形
for(int i = 0; i < n; i++){
for(int j = 0; j < n - i - 1; j++){
cout << " ";
}
for(int j = 0; j <= i; j++){
if(num < 10){
cout << 0 << num++;
} else {
cout << num++;
}
}
cout << endl;
}
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int ans[1005] = {0};
int main(){
int n, maxInd = 0, minInd = 0, sumN = 0;
cin >> n;
for(int i = 0; i < n; i++){
cin >> ans[i];
if(ans[maxInd] < ans[i]){
maxInd = i;
}
if(ans[minInd] > ans[i]){
minInd = i;
}
}
ans[maxInd] = 0;
ans[minInd] = 0;
for(int i = 0; i < n; i++){
sumN += ans[i];
}
cout << fixed << setprecision(2) << 1.0 * sumN / (n - 2) << endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
int n, weekMoney = 0, isFlag = 1, k = 1;
cin >> n;
weekMoney = n / 52; //算出每周需要多少钱
while(isFlag){
for(int x = 100; x > 0; x--){//取x最大,所以x倒着数
if((7 * x + 21 * k) == weekMoney){//一周的数相加
cout << x << endl << k << endl;
isFlag = 0;
}
}
++k;
}
return 0;
}
#include <iostream>
using namespace std;
int month[13] = {0};
int main(){
int free = 0, save = 0, isFlag = 1;
for(int i = 1; i < 13; i++){
cin >> month[i];
}
for(int i = 1; i < 13; i++){
free += 300;
if(free < month[i]){
cout << -i << endl;
isFlag = 0;
break;
}
free -= month[i];
if(free >= 100){
int temp = free / 100;
save += temp * 100;
free = free - temp * 100;
}
}
if(isFlag){
save = save * 0.2 + save + free;
cout << save << endl;
}
return 0;
}