算法竞赛入门【码蹄集新手村600题】(MT1220-1240)C语言
- 目录
- MT1221 分数的总和
- MT1222 等差数列
- MT1223 N是什么
- MT1224 棋盘
- MT1225 复杂分数
- MT1226 解不等式
- MT1227 宝宝爬楼梯
- MT1228 宝宝抢糖果
- MT1229 搬家公司
- MT1230 圆周率
- MT1231圆周率II
- MT1232 数字和
- MT1233 数字之和
- MT1234 一个数字
- MT1235 回文数字
- MT1236 回文
- MT1237 六六大顺
- MT1238 幸运数字3
- MT1239 自恋性数
- MT1240 好多自恋性数
码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist
目录
MT1221 分数的总和
(1)题目
格式
样例1
(2)参考代码
#include<stdio.h>
#define N 20
int main()
{double a[N], b[N], sum = 0;int i;a[0] = 1.0;a[1] = 2.0;b[0] = 2.0;b[1] = 3.0;for (i=2;i<N;i++){a[i] = a[i-1] + a[i-2];b[i] = b[i-1] + b[i-2];}//校验数据// for (i=0;i<N;i++)// {// printf("%lf %lf\n", a[i], b[i]);// }for (i=0;i<N;i++){sum = sum + (b[i] / a[i]);}printf("%.2lf", sum);
}
MT1222 等差数列
(1)题目
求等差数列前N项的级数之和。不考虑不合理的输入等特殊情况。
格式
输入格式:
输入N,首项M,差值K,整型,空格分隔。输出格式:
输出整型
样例1
输入:
5 1 3输出:
35
(2)参考代码
#include<stdio.h>
int main()
{ int N, M, K;scanf("%d %d %d", &N, &M, &K);printf("%d\n", M * N + N * (N - 1) * K / 2);return 0;
}
MT1223 N是什么
(1)题目
给定一系列数字3、10、21、36…,输入正整数N,输出上述序列的第N个值。从N=1开始计数。
格式
输入格式:
输入正整数N输出格式:
输出整型
样例1
输入:
5输出:
55
备注
N小于10000
(2)参考代码
#include<stdio.h>
int main()
{int N, num, i = 3;scanf("%d", &N);num = N * (i + 2 * (N - 1));printf("%d\n", num);
}
MT1224 棋盘
(1)题目
求一个N*N棋盘中的方块总数。
格式
输入格式:
输入整型N 输出格式:
输出整型
样例1
输入:
2输出:
5
备注
考虑到取值范围,可用long整型定义变量
(2)参考代码
#include<stdio.h>
int main()
{int N;long count = 0;scanf("%d", &N);for (int i = 1;i<=N;i++){count += (i * i);}printf("%ld", count);return 0;
}
MT1225 复杂分数
(1)题目
编写程序连续输入a1、a2、…、a5,计算下列表达式的值并输出。本题不考虑输入0,负数或者其他特殊情况。
格式
输入格式:
输入整型,空格分隔。输出格式:
输出为实型
样例1
输入格式:
1 2 3 4 5输出格式:
1.571429
(2)参考代码
#include<stdio.h>
int main()
{ double a[5];for (int i=0;i<5;i++){scanf("%lf", &a[i]);}double num = a[4];for (int i=3;i>=0;i--){num = 1 + a[i] / num;}printf("%lf", num);return 0;
}
MT1226 解不等式
(1)题目
n为正整数,求解n满足不等式:
格式
输入格式:
输入正整数a,b,空格分隔。输出格式:
输出整型区间上下限,空格分隔。
样例1
输入:
2010 2011输出:
18611 18621
备注
对于100%的数据:1<=n<=100,000,1<=a<b
(2)参考代码
#include<stdio.h>
int main()
{ int a, b, n1, n2;scanf("%d %d", &a, &b);double sum = 0, num = 0;for (int i=1;;i++){num += (1.0 / (double)i);sum += 1.0 / num;if (a < sum){n1 = i;break;}}for (int i=n1+1;;i++){num += (1.0 / (double)i);sum += 1.0 / num;if (b <= sum){n2 = i - 1;break;}}printf("%d %d", n1, n2);return 0;
}
MT1227 宝宝爬楼梯
(1)题目
楼梯有N个台阶(N<=10),宝宝想爬到顶部。她一次可以爬1级或2级台阶。统计宝宝可以用多少种方式爬到达顶端。
格式
输入格式:
输入正整数N输出格式:
输出整型
样例1
输入格式:
4输出格式:
5
(2)参考代码
#include<stdio.h>
int main()
{ int a[10] = {0, 1, 2};int N;scanf("%d", &N);for (int i=3;i<=N;i++){a[i] = a[i-1] + a[i-2];}printf("%d\n", a[N]);return 0;
}
MT1228 宝宝抢糖果
(1)题目
宝宝们一起抢N个糖果(N<=10),手快的宝宝可以抢到2个糖果,手慢的只能抢到一个糖果。统计糖果可以多少种方式被瓜分。
格式
输入格式:
输入正整数N输出格式:
输出整型
样例1
输入:
4输出:
5
(2)参考代码
MT1229 搬家公司
(1)题目
N件家具(N<=10),力气大的一次可以搬2件,力气小的一次只能搬1件。统计家具可以用多少种方式搬完。
格式
输入格式:
输入正整数N输出格式:
输出整型
样例1
输入格式:
4输出格式:
5
(2)参考代码
**#include<stdio.h>
int main()
{ int N, a[100] = {0, 1, 2};scanf("%d", &N);for (int i=3;i<=N;i++){a[i] = a[i-1] + a[i-2];}printf("%d", a[N]);return 0;
}**
MT1230 圆周率
(1)题目
编写一个程序,使用以下公式计算PI的近似值PI=4(1-1/3+1/5-1/7+1/9…)。括号中的最后一项应小于十的负六次方。
格式
输入格式:
无输出格式:
输出为实型,保留2位小数
样例1
输入:
无输出:
3.14
(2)参考代码
#include<stdio.h>
int main()
{double x = 0, PI = 0;for (int i = 1;;i += 2){x = 1 / (double)i;if (x < 1e-6){break;}if (i % 4 == 3){x = -x;}PI += x;}printf("%.2lf\n", 4 * PI);return 0;
}
MT1231圆周率II
(1)题目
由近似公式: T/2=2/1 * 2/3* 4/3 * 4/56/56/7 *8/7 * 8/9…,求圆周率(精确到10的-6次方)。
格式
输入格式:
无输出格式:
输出为实型,2位小数
样例1
输入格式:无输出格式:
3.14
(2)参考代码
#include<stdio.h>
int main()
{ double num = 1;for (double i=1;i<=1000000;i++){if ((int)i % 2){num *= ((i + 1) / i);}else{num *= (i / (i + 1));}}printf("%.2lf", num * 2);return 0;
}
MT1232 数字和
(1)题目
请编写一个简单程序,求一个数的各位数字之和。比如输入123,输出1+2+3的和6.
格式
输入格式:
输入整型 输出格式:
输出整型
样例1
输入:
123输出:
6
(2)参考代码
#include<stdio.h>
int main()
{ int x, sum = 0;scanf("%d", &x);while (x){sum += x % 10;x /= 10;}printf("%d", sum);return 0;
}
MT1233 数字之和
(1)题目
求一个自然数n中各位数字之和(n由用户输入)。不考虑负数等特殊情况。
格式
输入格式:
输入为整型输出格式:
输出为整型
样例1
输入:
567输出:
18
(2)参考代码
#include<stdio.h>
int main()
{ int n, count = 0, sum = 0;scanf("%d", &n);int temp = n;while (temp){temp /= 10;count++;}for (int i=0;i<count;i++){sum += n % 10;n /= 10;}printf("%d", sum);return 0;
}
MT1234 一个数字
(1)题目
输入一个非负整数N,重复将其所有数字相加,直到结果只有一个数字,输出这个数字,输出最小列宽3列。
格式
输入格式:
输入整型输出格式:
输出整型
样例1
输入:
89输出:8
(2)参考代码
#include<stdio.h>
int main()
{ int N, sum;scanf("%d", &N);do{sum = 0;while (N){sum += N % 10;N /= 10;}N = sum;}while (sum >= 10);printf("%3d\n", sum);return 0;
}
MT1235 回文数字
(1)题目
请编写一个简单程序,检查数字是否为回文。像12521,123321,这样的从左向右读和从右向左读是一样的数字是回文数字。
格式
输入格式:
输入整型输出格式:
输出Y或N
样例1
输入格式:
12521输出格式:
Y
(2)参考代码
#include<stdio.h>
int main()
{ int n;scanf("%d", &n);int temp = n, N = 0;while (temp){N = (N * 10) + (temp % 10);temp /= 10;}if (N == n){printf("Y");}else{printf("N");}return 0;
}
MT1236 回文
(1)题目
输入正整数N,判断N的各位数字之和是否为回文数。(注:回文数是一个在反转时保持不变的数。比如121,7等。)不考虑不合理的输入等特殊情况。
格式
输入格式:
输入正整数N输出格式:
输出YES或者NO
样例1
输入:
56输出:
YES
备注
测试数据集输入数据包含长整型。
(2)参考代码
MT1237 六六大顺
(1)题目
输入正整数N,输出N以内(含N),6的倍数,并且包含6的数字,比如36等。
格式
输入格式:
输入整型输出格式:
输出整型,空格分隔
样例1
输入格式:40输出格式:6 36
(2)参考代码
#include<stdio.h>
int main()
{ int N;scanf("%d", &N);for (int i=1;i<=N;i++){int temp = i, flag = 0;while (temp){if (temp % 10 == 6){flag = 1;}temp /= 10;}if (flag == 1){if (i % 6 == 0){printf("%d ", i);}}}return 0;
}
MT1238 幸运数字3
(1)题目
输入正整数N,输出N以内(含N) 3的倍数,或者包含3的数字,比如13,32等。
格式
输入格式:
输入整型输出格式:
输出整型,空格分隔。
样例1
输入格式:
20输出格式:
3 6 9 12 13 15 18
(2)参考代码
#include<stdio.h>
int main()
{ int N, temp, flag;scanf("%d", &N);for (int i=3;i<=N;i++){temp = i;flag = 0;while (temp){if (temp % 10 == 3){printf("%d ", i);flag = 1;break;} temp /= 10;}if (flag == 0 && i % 3 == 0){printf("%d ", i);}}return 0;
}
MT1239 自恋性数
(1)题目
请编写一个简单程序,判断自恋性数。如果一个正整数等于其各个数字的立方和,则称该数为自恋性数(亦称为阿姆斯特朗数)
格式
输入格式:
输入整型 输出格式:
输出Y或者N
样例1
输入:
407输出:
Y
(2)参考代码
#include<stdio.h>
#include<math.h>
int main()
{ int x, temp, count = 0;scanf("%d", &x);temp = x;while (temp){count += pow(temp % 10, 3); temp /= 10;}if (x == count){printf("Y");}else{printf("N");}return 0;
}
MT1240 好多自恋性数
(1)题目
请编写一个简单程序,输入正整数n,输出n以内自恋性数。如果一个正整数等于其各个数字的立方和,则称该数为自恋性数(亦称为阿姆斯特朗数)
格式
输入格式:
输入为整型输出格式:
输出整型,空格分隔
样例1
输入格式:
500输出格式:
1 153 370 371 407
(2)参考代码
#include<stdio.h>
#include<math.h>
int main()
{ int n, temp, num;scanf("%d", &n);for (int i=1;i<=n;i++){temp = i;num = 0;while (temp){num += pow((double)(temp % 10), 3.0);temp /= 10;}if (num == i){printf("%d ", i);}}return 0;
}