算法竞赛入门【码蹄集新手村600题】(MT1240-1260)C语言
码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist
目录
MT1241 大数
(1)题目
输入一个数字N,编写一个程序,用该数字的所有数字重组一个最大数字。不考虑负数,0等特殊情况。注意:给定的数字可能非常大,因此输入被视为字符串。
格式
输入格式:
输入字符串
输出格式:
输出字符串
样例1
输入:
38293367
输出:
98763332
(2)参考代码
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
scanf("%s", a);
for (int i=9;i>=0;i--)
{
for (int j=0;j<strlen(a);j++)
{
if (a[j] == i + '0')
{
printf("%c", a[j]);
}
}
}
return 0;
}
MT1242 三个非负整数
(1)题目
给定一个正整数N,将其分解为3个非负整数的累加和,并统计出这样做的方法数。比如2,有2种分解方法:
0 + 0 + 2 = 2 (0 + 2 + 0 = 2 2 + 0 + 0 = 2 可以和左边等式看做同一种)
0 + 1 + 1 = 2 (1 + 1 + 0 = 2 1 + 0 + 1 = 2 可以和左边等式看做同一种)
格式
输入格式:
输入整型
输出格式:
输出整型
样例1
输入:
3
输出:
3
(2)参考代码
#include<stdio.h>
int main()
{
int N, count = 0;
scanf("%d", &N);
for (int i=0;i<=N;i++)
{
for (int j=i;j<=N;j++)
{
if (N - i - j >= j)
{
count++;
}
}
}
printf("%d", count);
return 0;
}
MT1243 四个正整数
(1)题目
输入一个正整数N,计算将N表示为四个正整数之和(比如5= 1+1+1+2)的可能方法的数量。
格式
输入格式:
输入整型
输出格式:
输出整型
样例1
输入格式:
41
输出格式:
511
(2)参考代码
#include<stdio.h>
int main()
{
int N, count = 0;
scanf("%d", &N);
for (int i=1;i<=N;i++)
{
for (int j=i;j<=N;j++)
{
for (int k=j;k<=N;k++)
{
if (N - i - j - k >= k)
{
count++;
}
}
}
}
printf("%d", count);
return 0;
}
MT1244 减到0
(1)题目
输入两个正整数A和B,重复从较大整数中减去较小整数直到其中一个变为0,输出所需的步骤数。比如5和13。(5,13)->(5,8)->(5,3)->(2,3)->(2,1)->(1,1)->(1,0)一共需要减6次。不考虑不合理的输入等特殊情况。
格式
输入格式:
输入整型,空格分隔。
输出格式:
输出整型
样例1
输入:
5 15
输出:
3
(2)参考代码
#include<stdio.h>
int main()
{
int a, b, count = 0;
scanf("%d %d", &a, &b);
while (a != 0 && b != 0)
{
if (a >= b)
{
a = a - b;
}
else
{
b = b - a;
}
count++;
}
printf("%d", count);
return 0;
}
MT1245 五年花光
(1)题目
银行利息月息为0.553%。某人五年中每年年底都取出1000元,到第五年时刚好取完。求存入的钱应是多少?
格式
输入格式:
无
输出格式:
输出实型,保留2位小数。
样例1
输入格式:
无
输出格式:
4140.47
(2)参考代码
#include<stdio.h>
int main()
{
double n = 0, rate = 12 * 0.00553;
for (int i=0;i<5;i++)
{
n = (n + 1000) / (1 + rate);
}
printf("%.2lf", n);
return 0;
}
MT1246 存入的钱
(1)题目
假设银行利息月息为0.63%。某人将一笔钱存入银行,打算在今后五年中每年年底都取出1000元,到第五年时刚好取完。求存入的钱应是多少?
格式
输入格式:
无
输出格式:
输出实型,保留2位小数。
样例1
输入格式:
无
输出格式:
4039.44
(2)参考代码
#include<stdio.h>
int main()
{
double n = 0;
for (int i=1;i<=5;i++)
{
n += 1000;
n = n / (1 + 12 * 0.0063);
}
printf("%.2lf", n);
return 0;
}
MT1247 存10年钱
(1)题目
银行利息月息为0.58%。某人10年中每年年底都取出1000元,到第10年时刚好取完。求存入的钱应是多少?
格式
输入格式:
无
输出格式:
输出实型,保留2位小数。
样例1
输入:
无
输出:
7036.59
(2)参考代码
#include<stdio.h>
int main()
{
double n = 0;
for (int i=1;i<=10;i++)
{
n += 1000;
n = n / (1 + 12 * 0.0058);
}
printf("%.2lf", n);
return 0;
}
MT1248 吃桃
(1)题目
猴子摘了一堆桃,第一天吃了一半又多吃了一个,第二天把剩下的吃了一半,又多吃了一个。以后每天都吃了一半零一个。到第10天,只剩下一个,问原本又多少个桃子。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入格式:
无
输出格式:
1534
(2)参考代码
#include<stdio.h>
int main()
{
int n = 1;
for (int i=0;i<9;i++)
{
n = (n + 1) * 2;
}
printf("%d", n);
return 0;
}
MT1249 练兵
(1)题目
兽人族的首领很聪明,总是先让士兵3人一排站队,再5人一排重新站队,最后再7人一排,他只用看看队尾人数就知道今天有多少人迟到了。输入3个非负整数a,b,c表示每种队形队尾的人数(a<3,b<5,c<7),计算总人数,无解则输出-1。 总人数在10到100之间。
格式
输入格式:
输入整型,空格分隔。
输出格式:
输出整型
样例1
输入:
2 1 6
输出:
41
(2)参考代码
#include<stdio.h>
int main()
{
int x1, x2, x3;
scanf("%d %d %d", &x1, &x2, &x3);
for (int i=10;i<=100;i++)
{
if (i % 3 == x1 && i % 5 == x2 && i % 7 == x3)
{
printf("%d", i);
return 0;
}
}
printf("-1");
return 0;
}
MT1250 阶梯
(1)题目
科学家出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。编写程序求这条阶梯共有多少阶?
格式
输入格式:
无
输出格式:
119
样例1
输入:
无
输出:
119
(2)参考代码
#include<stdio.h>
int main()
{
for (int i=1;i<=1000;i++)
{
if (i % 2 == 1 && i % 3 == 2 && i % 5 == 4 && i % 6 == 5 && i % 7 == 0)
{
printf("%d", i);
return 0;
}
}
return 0;
}
MT1251 百钱买百猫
(1)题目
有人有一百块钱,打算买一百只猫。公猫一只5元,母猫一只3元,小猫3只1元,求应各买多少?
格式
输入格式:
无
输出格式:
分行输出,每行—组整数
样例1
输入格式:
无
输出格式:
公猫=0 母猫=25 小猫=75
公猫=4 母猫=18 小猫=78
公猫=8 母猫=11 小猫=81
公猫=12 母猫=4 小猫=84
(2)参考代码
#include<stdio.h>
int main()
{
for (int i=0;i<=20;i++)
{
for (int j=0;j<=33;j++)
{
for (int k=0;k<=100;k++)
{
if (k % 3 == 0 && i + j + k == 100 && 5 * i + 3 * j + k / 3 == 100)
{
printf("公猫=%d 母猫=%d 小猫=%d\n", i, j, k);
}
}
}
}
return 0;
}
MT1252 自除数
(1)题目
自除数是可以被它包含的每一位数除尽的数。例如128,可以被1,2 和8整除。自除数位数中不包含0。输入整数,判断它是不是一个自除数,是就输出YES,否则输出NO。输入不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型
输出格式:
输出为YES或者NO
样例1
输入:
12
输出:
YES
(2)参考代码
#include<stdio.h>
int main()
{
int n, x;
scanf("%d", &n);
int temp = n;
while (temp)
{
x = temp % 10;
if (x == 0)
{
printf("NO");
return 0;
}
if (n % x != 0)
{
printf("NO");
return 0;
}
temp /= 10;
}
printf("YES");
return 0;
}
MT1253 区间自除数
(1)题目
自除数是可以被它包含的每一位数除尽的数。例如128,可以被1,2和8整除。自除数位数中不包含0。输入整数区间,输出区间(含边界)内所有的自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型,空格分隔
输出格式:
输入出整型,空格分隔
样例1
输入格式:
1 19
输出格式:
1 2 3 4 5 6 7 8 9 11 12 15
(2)参考代码
#include<stdio.h>
int main()
{
int a, b, temp, flag;
scanf("%d %d", &a, &b);
for (int i=a;i<=b;i++)
{
temp = i;
flag = 1;
while (temp)
{
if (temp % 10 == 0 || i % (temp % 10) != 0)
{
flag = 0;
break;
}
temp /= 10;
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
MT1254 最大自除数
(1)题目
自除数是可以被它包含的每一位数除尽的数。例如128,因为可以被1,2 和8整除。自除数不包含 0。输入整数区间,输出区间(含边界)内最大自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型,空格分隔
输出格式:
输出为整型
样例1
输入:
1 20
输出:
15
(2)参考代码
#include<stdio.h>
int main()
{
int a, b, temp, flag;
scanf("%d %d", &a, &b);
for (int i=b;i>=a;i--)
{
temp = i;
flag = 1;
while (temp)
{
if (temp % 10 == 0 || i % (temp % 10) != 0)
{
flag = 0;
break;
}
temp /= 10;
}
if (flag == 1)
{
printf("%d ", i);
break;
}
}
return 0;
}
MT1255 最小自除数
(1)题目
自除数是可以被它包含的每一位数除尽的数。例如128,因为可以被1,2 和8整除。自除数不包含 0。输入整数区间,输出区间(含边界)内最小自除数。不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型,空格分隔
输出格式:
输出为整型
样例1
输入:
10 21
输出:
11
(2)参考代码
#include<stdio.h>
int main()
{
int a, b, temp, flag;
scanf("%d %d", &a, &b);
for (int i=a;i<=b;i++)
{
temp = i;
flag = 1;
while (temp)
{
if (temp % 10 == 0)
{
flag = 0;
break;
}
if ((i % (temp % 10)) != 0)
{
flag = 0;
}
temp /= 10;
}
if (flag == 1)
{
printf("%d\n", i);
break;
}
}
return 0;
}
MT1256 最小数
(1)题目
给定两个整数N和M。找出可被M整除的最小数K(大于N),输出K,最小列宽为3。
格式
输入格式:
输入正整数N和M
输出格式:
输出整型
样例1
输入:
25 13
输出:
26
备注
本题中,K<10000
(2)参考代码
#include<stdio.h>
int main()
{
int N, M;
scanf("%d %d", &N, &M);
for (int i=N+1;;i++)
{
if (i % M == 0)
{
printf("%3d", i);
break;
}
}
return 0;
}
MT1257 被3整除的五位数
(1)题目
统计个位是5但能被3整除的五位数有多少个,输出结果。
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
3000
(2)参考代码
#include<stdio.h>
int main()
{
int x = 3;
int count = 0;
for (int i = 10000;i<=99999;i++)
{
if (i % x == 0 && i % 10 == 5)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
MT1258 特殊整数
(1)题目
输入正整数m和n,找到包含m但不能被m整除的n位整数,统计这样的n位整数有多少个。本题不考虑不合理的输入或者溢出等特殊情况。
格式
输入格式:
输入整型,空格分隔。
输出格式:
输出整型
样例1
输入格式:
7 5
输出格式:
32152
(2)参考代码
#include<stdio.h>
#include<math.h>
int main()
{
int m, n, temp, flag, count = 0;
scanf("%d %d", &m, &n);
int num = pow(10.0, (double)n);
for (int i=num/10;i<=num-1;i++)
{
temp = i;
flag = 0;
while (temp)
{
if (temp % 10 == m)
{
flag = 1;
break;
}
temp /= 10;
}
if (flag == 1 && i % m != 0)
{
count++;
}
}
printf("%d", count);
return 0;
}
MT1259 统计哈沙德数
(1)题目
如果一个数字可被其数字之和整除,则称该数字为哈沙德数,输入一个大于9的正整数N,判断统计10到N之间(包含N)有多少个哈沙德数,输出结果。
格式
输入格式:
输入整型
输出格式:
输出整型
样例1
输入格式:
30
输出格式:
8
(2)参考代码
#include<stdio.h>
int main()
{
int N, temp, sum, count = 0;
scanf("%d", &N);
for (int i=10;i<=N;i++)
{
temp = i;
sum = 0;
while (temp)
{
sum += temp % 10;
temp /= 10;
}
if (i % sum == 0)
{
count++;
}
}
printf("%d", count);
return 0;
}
MT1260 袋鼠躲猫猫
(1)题目
两只袋鼠在一个总长L米的圆环上躲猫猫。假定环上某一点为坐标原点0,袋鼠宝宝的出发坐标是x,袋鼠妈妈出发坐标是y,单位是米,宝宝一小时能跳a次,妈妈一小时跳b次,假定他们每一跳的距离都是1米,求多少小时后宝宝和妈妈才能见面。如果无法见面则输出-1。x,y, a,b,L都属于正常int范围。“见面”以每小时结束时刻,两只袋鼠的落点相同为准。
格式
输入格式:
输入5个正整数x,y, a,b,L,空格分隔。其中x不等于y。
输出格式:
输出整型
样例1
输入格式:
1 2 3 4 5
输出格式:
4
(2)参考代码
#include<stdio.h>
int main()
{
int x, y, a, b, l, time = 1;
scanf("%d %d %d %d %d", &x, &y, &a, &b, &l);
if (a == b)
{
printf("-1");
return 0;
}
while ((x + a) % l != (y + b) % l)
{
x = (x + a) % l;
y = (y + b) % l;
time++;
}
printf("%d", time);
return 0;
}