算法竞赛入门【码蹄集新手村600题】(MT1140-1160)C语言
- 目录
- MT1141 数字3
- MT1142 整除的总数
- MT1143 沙哈德数
- MT1144 整除
- MT1145 全部整除
- MT1146 孙子歌诀
- MT1147 古人的剩余定理
- MT1148 隐晦余8
- MT1149 余数
- MT1150 战死四五百
- MT1151 韩信生气
- MT1152 韩信又生气了
- MT1153 真因子
- MT1154 缺数
- MT1155 单位矩阵
- MT1156 稀疏矩阵
- MT1157 矩阵相等
- MT1158 分解
- MT1159 指定集合
- MT1160 尾数为0
码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist
目录
MT1141 数字3
(1)题目
给您一个整数输入N,如果它是整数13的和或差(13+13, 13-13,13-13-13+13+13…),输出YES,否则输出NO。
格式
输入格式:
输入为整型
输出格式:
输出为YES或者NO
样例1
输入:
14
输出:
NO
(2)参考代码
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n % 13 == 0 || n == 0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1142 整除的总数
(1)题目
输入正整数N和M,其中N<=M。求区间[N,M]中可被K整除的总数。
格式
输入格式:
输入正整数N,M和K,空格分隔。
输出格式:
输出整型
样例1
输入:
6 15 3
输出:
4
(2)参考代码
#include<stdio.h>
int main()
{
int a, b, x;
scanf("%d %d %d", &a, &b, &x);
int count = 0;
for (int i=a;i<=b;i++)
{
if (i % x == 0 || i == 0)
{
count++;
}
}
printf("%d", count);
return 0;
}
MT1143 沙哈德数
(1)题目
如果一个数字可被其数字之和整除,则称该数字为Harshad哈沙德数,输入一个正整数,判断他是不是哈沙德数,输出YES或者NO。
格式
输入格式:
输入整型
输出格式:
输出YES或者NO
样例1
输入格式:
156
输出格式:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int temp = n, sum = 0;
while (temp)
{
sum += temp % 10;
temp /= 10;
}
if (n % sum == 0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1144 整除
(1)题目
输入正整数N,检查它是否可以被其数字之和整除,输出YES或者NO。不考虑不合理的输入等特殊情况。
格式
输入格式:
输入正整数N
输出格式:
输出YES或者NO
样例1
输入:
18
输出:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int N, sum = 0;
scanf("%d", &N);
int temp = N;
while (temp)
{
sum += temp % 10;
temp /= 10;
}
if (N % sum == 0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1145 全部整除
(1)题目
输入正整数N,找到一个最小的整数K,可以被1到N的每个数整除。
格式
输入格式:
输入整型
输出格式:
输出整型
样例1
输入格式:
6
输出格式:
60
(2)参考代码
#include<stdio.h>
int main()
{
int N, flag;
scanf("%d", &N);
for (int i=N;;i++)
{
flag = 1;
for (int j=1;j<=N;j++)
{
if (i % j != 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d", i);
break;
}
}
return 0;
}
MT1146 孙子歌诀
(1)题目
存在一个数x,除以3余2,除以5余3,除以7余2,然后求这个数。明朝数学家程大位将解法编成易于上口的《孙子歌诀》:
三人同行七十稀,
五树梅花廿一支,
七子团圆正半月,
除百零五使得知。
3人同行“70” 稀,3的余数乘以70,5树梅花“21”支,5的余数乘以21,7子团圆正半月(15天),7的余数乘以15。最后加在一起除以105看余数。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
23
(2)参考代码
#include<stdio.h>
int main()
{
int x1, x2, x3;
x1 = 2 * 70;
x2 = 3 * 21;
x3 = 2 * 15;
printf("%d", (x1 + x2 + x3) % 105);
return 0;
}
MT1147 古人的剩余定理
(1)题目
今有物不知其数,
三三数之剩二,
五五数之剩三,
七七数之剩二。
问物最少几何?
格式
输入格式:
无
输出格式:
输出整型
样例1
输入格式:
无
输出格式:
23
(2)参考代码
#include<stdio.h>
int main()
{
for (int i=1;;i++)
{
if (i % 3 == 2 && i % 5 == 3 && i % 7 == 2)
{
printf("%d", i);
break;
}
}
return 0;
}
MT1148 隐晦余8
(1)题目
存在一个数x(大于10),除以3余2,除以5余3,除以7余1,求这个数最小值。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
113
(2)参考代码
#include<stdio.h>
int main()
{
int i = 0;
while (1)
{
if ((i % 3 == 2 && i % 5 == 3) && (i % 7 == 1 && i > 10))
{
printf("%d", i);
break;
}
else
{
i++;
}
}
return 0;
}
MT1149 余数
(1)题目
存在一个数x(大于10),除以7余2,除以11余4,除以13余5,求这个数最小值。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
499
(2)参考代码
#include<stdio.h>
int main()
{
int i = 0;
while (1)
{
if ((i % 7 == 2 && i % 11 == 4) && (i % 13 == 5 && i > 10))
{
printf("%d", i);
break;
}
else
{
i++;
}
}
return 0;
}
MT1150 战死四五百
(1)题目
带1500名兵士打仗,战死四五百人,站3人一排,多出2人;站5人一排,多出4人;站7人一排,多出6人。问战死多少人。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
451
(2)参考代码
#include<stdio.h>
int main()
{
int i = 400;
while (1)
{
int j = 1500;
j -= i;
if ((j % 3 == 2 && j % 5 == 4) && j % 7 == 6)
{
printf("%d", i);
break;
}
else
{
i++;
}
}
return 0;
}
MT1151 韩信生气
(1)题目
韩信点兵(大于10人),三个三个一排多2个,五个五个一排又多2个,七个七个一排还多2个。韩信生气了,怎么总多你俩,出去!问原本队伍里面最少应该有多少人。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
107
(2)参考代码
#include<stdio.h>
int main()
{
int i = 0;
while (1)
{
if ((i % 7 == 2 && i % 3 == 2) && (i % 5 == 2 && i > 10))
{
printf("%d", i);
break;
}
else
{
i++;
}
}
return 0;
}
MT1152 韩信又生气了
(1)题目
韩信点兵(大于10人),三个三个一排少1个人,五个五个一排又少1个人,七个七个一排还少1个人。韩信生气了,从别的队伍里调来一个人!这样不管是三个一排五个一排还是七个一排都完美了。问原本最少应该有多少人。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
104
(2)参考代码
#include<stdio.h>
int main()
{
int i = 0;
while (1)
{
if ((i % 7 == 6 && i % 3 == 2) && (i % 5 == 4 && i > 10))
{
printf("%d", i);
break;
}
else
{
i++;
}
}
return 0;
}
MT1153 真因子
(1)题目
输入正整数N,计算其所有真因子之和。自然数的真因子是严格小于该数的除数。
格式
输入格式:
输入正整数N
输出格式:
输出整型
样例1
输入:
10
输出:
8
备注
N>2
(2)参考代码
#include<stdio.h>
int main()
{
int N, count = 0;
scanf("%d", &N);
for (int i=1;i<N;i++)
{
if (N % i == 0)
{
count += i;
}
}
printf("%d", count);
return 0;
}
MT1154 缺数
(1)题目
若一个自然数的所有真因数之和比这个数小,此数就叫做缺数。输入正整数N,找出该数字是否为缺数输出YES或者NO。
格式
输入格式:
输入正整数N
输出格式:
输出YES或者NO
样例1
输入:
21
输出:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int N, count = 0;
scanf("%d", &N);
for (int i=1;i<N;i++)
{
if (N % i == 0)
{
count += i;
}
}
if (count < N)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1155 单位矩阵
(1)题目
输入3X3的整型矩阵A,判断是否为单位矩阵,输出YES或者NO。
格式
输入格式:
输入矩阵,空格分隔
输出格式:
输出YES或者NO
样例1
输入:
1 0 0 0 1 0 0 0 1
输出:
YES
(2)参考代码
#include<stdio.h>
#define N 9
int main()
{
int a[N], flag = 1;
for (int i=0;i<N;i++)
{
scanf("%d", &a[i]);
}
for (int i=0;i<N;i++)
{
if (i == 0 || i == 4 || i == 8)
{
if (a[i] != 1)
{
flag = 0;
}
}
else
{
if (a[i] != 0)
{
flag = 0;
}
}
}
if (flag == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1156 稀疏矩阵
(1)题目
输入3X3的整型矩阵A,判断是否为稀疏矩阵,输出YES或者NO。若矩阵中数值为0的元素数目多于非0元素的数目就叫做稀疏矩阵。
格式
输入格式:
输入矩阵,空格分隔
输出格式:
输出YES或者NO
样例1
输入格式:
4 0 0 0 5 0 0 0 6
输出格式:
YES
(2)参考代码
#include<stdio.h>
#define N 9
int main()
{
int a[N], i, count_0 = 0, count_1 = 0;
for (i=0;i<N;i++)
{
scanf("%d", &a[i]);
}
for (i=0;i<N;i++)
{
if (a[i] == 0)
{
count_0++;
}
else
{
count_1++;
}
}
if (count_0 > count_1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1157 矩阵相等
(1)题目
输入4X4的整型矩阵A和B,判断是否为相等,输出YES或者NO。
格式
输入格式:
输入矩阵,空格分隔。
输出格式:
输出YES或者NO
样例1
输入:
4 0 0 0 5 0 0 0 6 1 2 3 4 5 6 7
4 0 0 0 5 0 0 0 6 1 2 3 4 5 6 7
输出:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int a[4][4], b[4][4];
int i, j, flag = 1;
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
{
scanf("%d", &a[i][j]);
}
}
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
{
scanf("%d", &b[i][j]);
}
}
for (i=0;i<4;i++)
{
for (j=0;j<4;j++)
{
if (a[i][j] != b[i][j])
{
flag = 0;
break;
}
}
}
if (flag == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1158 分解
(1)题目
输入正整数N和M,判断N是否可以分解成M个不同的正整数的和,输出YES或者NO。
格式
输入格式:
输入正整数N和M,空格分隔
输出格式:
输出YES或者NO
样例1
输入格式:
5 2
输出格式:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int N, M;
scanf("%d %d", &N, &M);
if (N >= ((M + 1) * M) / 2)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
MT1159 指定集合
(1)题目
某数组含有N个元素,输出那些数字来自集合{4,5,6}的元素,按原序。没有就输出-1。
格式
输入格式:
第一行输入数组长度N,第二行输入数组元素,整型,空格分隔。
输出格式:
输出整型,空格分隔。
样例1
输入:
4
1 2 3 4
输出:
4
(2)参考代码
#include<stdio.h>
//#include<stdlib.h>
int main()
{
int N, i;
int flag = 1;
scanf("%d", &N);
int* num = (int*)malloc(sizeof(int) * N);
for (i=0;i<N;i++)
{
scanf("%d", &num[i]);
}
for (i=0;i<N;i++)
{
if (num[i] == 4 || num[i] == 5 || num[i] == 6)
{
flag = 0;
printf("%d ", num[i]);
}
}
if (flag == 1)
{
printf("-1");
}
return 0;
}
MT1160 尾数为0
(1)题目
输入正整数N,请在1!,2! , 3! …N!中查找尾数为零的数,统计这样的数字的个数并输出。
格式
输入格式:
输入正整数N
输出格式:
输出整型
样例1
输入格式:
5
输出格式:
1
(2)参考代码
#include<stdio.h>
int main()
{
int N, factorial, count = 0;
scanf("%d", &N);
for (int i=1;i<=N;i++)
{
factorial = 1;
for (int j=1;j<=i;j++)
{
factorial *= j;
}
if (factorial % 10 == 0)
{
count++;
}
}
printf("%d", count);
return 0;
}