算法竞赛入门【码蹄集新手村600题】(MT1180-1200)C语言
- 目录
- MT1181 圆包含
- MT1182 圆相交
- MT1183 矩形包含
- MT1184 矩形相交
- MT1185 while循环
- MT1186 do-while循环
- MT1187 累加和
- MT1188 平均值
- MT1189 正数负数的和
- MT1190 分数乘法
- MT1191 减半
- MT1192 翻倍
- MT1193 偶数的平方和
- MT1194 奇数的平方和
- MT1195 公式求和
- MT1196 阶乘
- MT1197 阶乘和
- MT1198 阶乘差
- MT1199 公式计算
- MT1200 常数e
 

 码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist
目录
MT1181 圆包含
(1)题目
 输入2个圆的圆心的坐标值(x,y)和半径,判断断一个圆是否完全包含另一个圆,输出YES或者NO。另:内切不算做完全包含。
格式
输入格式: 
输入整型,空格分隔。每行输入一组信息。
输出格式: 
输出YES或者NO
样例1
输入格式:
-20 20 50
50 50 1
输出格式: 
NO
(2)参考代码
#include<stdio.h>
#include<math.h>
int main()
{
    int x1, y1, r1;
    int x2, y2, r2;
    scanf("%d %d %d", &x1, &y1, &r1);
    scanf("%d %d %d", &x2, &y2, &r2);
    int AB;
    if (r1 > r2)
    {
        AB = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        if (AB < (r1 - r2))
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    else if (r1 < r2)
    {
        AB = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        if (AB < (r2 - r1))
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    else
    {
        printf("NO");
    }
    return 0;
}
MT1182 圆相交
(1)题目
 输入2个圆的圆心的坐标值(x,y)和半径,判断2个圆是否相交,输出YES或者NO。
格式
输入格式: 
输入整型,空格分隔。每行输入一组信息。
输出格式: 
输出YES或者NO
样例1
输入格式:
-20 20 50
50 50 1
输出格式: 
NO
(2)参考代码
#include<stdio.h>
#include<math.h>
int main() 
{ 
    int x1, y1, r1, x2, y2, r2;
    scanf("%d %d %d", &x1, &y1, &r1);
    scanf("%d %d %d", &x2, &y2, &r2);
    int AB = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    if (r1 >= r2)
    {
        if (AB >= (r1 - r2) && AB < (r1 + r2))
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    else
    {
        if (AB >= (r2 - r1) && AB < (r1 + r2))
        {
            printf("YES");
        }
        else
        {
            printf("NO");
        }
    }
    return 0; 
}
MT1183 矩形包含
(1)题目
 输入2个矩形的左上角和右下角两个点的坐标值(x,y),判断2个矩形是否相互包含(一个在另一个内部,边框不重叠),输出YES或者NO。矩形的边应与x,y轴相平行。
格式
输入格式:
输入整型,空格分隔。 每行输入一组信息。
输出格式:
输出YES或者NO
样例1
输入:
-20 20 20 -10 
-10 10 10 -5
输出:
YES
(2)参考代码
#include<stdio.h>
int main()
{
    int x1, y1, x2, y2, x3, y3, x4, y4;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    scanf("%d %d %d %d", &x3, &y3, &x4, &y4);
    if ((x1 < x3 && x3 < x2 && y3 < y1 && y3 > y2) && (x1 < x4 && x4 < x2 && y4 < y1 && y4 > y2))
    {
        printf("YES");
    }
    else if ((x3 < x1 && x1 < x4 && y1 < y3 && y1 > y4) && (x3 < x2 && x2 < x4 && y2 < y3 && y2 > y4))
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}
MT1184 矩形相交
(1)题目
 输入2个矩形的左上角和右下角两个点的坐标值(x,y),判断2个矩形是否相交,输出YES或者NO。矩形的边应与x,y轴相平行。假定输入坐标能顺利构成矩形,不考虑无效矩形的情况。
格式
输入格式:
输入整型,空格分隔。 每行输入一组信息。
输出格式:
输出YES或者NO
样例1
输入:
-20 20 20 -10 
-10 10 10 -5
输出:
NO
(2)参考代码
MT1185 while循环
(1)题目
 请编写一个简单程序,从小到大输出所有小于8的正整数和0(从0开始输出)。
格式
输入格式:
无
输出格式:
输出整型,空格分隔 
样例1
输入:
无
输出:
0 1 2 3 4 5 6 7
(2)参考代码
#include<stdio.h>
int main() 
{
    int i = 0;
    while (i < 8)
    {
        printf("%d ", i);
        i++;
    }
    return 0; 
}
MT1186 do-while循环
(1)题目
 请编写一个简单程序,从大到小输出所有小于n的正整数,直到0为止(不含0)。n从键盘输入
格式
输入格式:
输入整型数n
输出格式:
输出整型,空格分隔 
样例1
输入:
10
输出:
10 9 8 7 6 5 4 3 2 1
(2)参考代码
#include<stdio.h>
int main() 
{
    int n;
    scanf("%d", &n);
    do
    {
        printf("%d ", n);
        n--;
    }
    while(n);
    return 0; 
}
MT1187 累加和
(1)题目
 从1累加到10,输出累加和
格式
输入格式:
无
输出格式:
输出整型
样例1
输入:
无
输出:
55
(2)参考代码
#include<stdio.h>
int main() 
{
    int i;
    int sum = 0;
    for (i=0;i<=10;i++)
    {
        sum += i;
    }
    printf("%d", sum);
    return 0; 
}
MT1188 平均值
(1)题目
 请编写一个简单程序,随机输入n个数字,输出他们的平均值
格式
输入格式:
输入分两行,第一行输入n,第二行输入n个float型数据,空格分隔
输出格式:
输出float型,空格分隔,保留2位小数
样例1
输入:
5
1 3 6 2 5.2 
输出:
3.44
(2)参考代码
#include<stdio.h>
int main() 
{
    int n, i;
    float temp, sum = 0;
    scanf("%d", &n);
    for (i=0;i<n;i++)
    {
        scanf("%f", &temp);
        sum += temp;
    }
    printf("%.2f", sum/n);
    return 0; 
}
MT1189 正数负数的和
(1)题目
 编写程序先输入n,再输入n个实数并分别统计正数的和、负数的和,然后输出统计结果。
格式
输入格式:
输入分两行,第一行输入整数n,第二行输入n个实数,空格分隔。
输出格式:
输出正数的和,和负数的和,实型,中间一个空格
样例1
输入:
4  
1 -3 0.5 -2
输出:
1.500000 -5.000000
(2)参考代码
#include<stdio.h>
int main() 
{
    int n, i;
    double temp, p_sum = 0, n_sum = 0;
    scanf("%d", &n);
    for (i=0;i<n;i++)
    {
        scanf("%lf", &temp);
        if (temp >= 0)
        {
            p_sum += temp;
        }
        else
        {
            n_sum += temp;
        }
    }
    printf("%lf %lf", p_sum, n_sum);
    return 0; 
}
MT1190 分数乘法
(1)题目
 输入5组分数,对他们进行乘法运算,输出结果。不考虑分母为0等特殊情况。
格式
输入格式:
输入整型,每组一行,如样例所示。
输出格式:
输出计算结果实型,如样例所示。
样例1
输入:
1/2 1/4  
2/3 1/7  
3/5 2/7
3/13 2/5
1/9 11/15
输出:
0.125000  
0.095238  
0.171429  
0.092308  
0.081481
(2)参考代码
#include<stdio.h>
int main() 
{
    double x1, y1, x2, y2, i, result;
    for (i=0;i<5;i++)
    {
        scanf("%lf/%lf %lf/%lf", &x1, &y1, &x2, &y2);
        result = (x1 / y1) * (x2 / y2);
        printf("%lf\n", result);
    }
    return 0; 
}
MT1191 减半
(1)题目
 输入两个值N和M,输出N做M次减半后的值。比如100,减半后依次为50, 25, 12…,减半3次后是12。输入不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型,空格分隔
输出格式:
输出为整型
样例1
输入:
100 3
输出:
12
(2)参考代码
#include<stdio.h>
int main() 
{
    int N, M;
    scanf("%d %d", &N, &M);
    for (int i=0;i<M;i++)
    {
        N /= 2;
    }
    printf("%d", N);
    return 0; 
}
MT1192 翻倍
(1)题目
 输入两个值N和M。输出N做M次翻倍后的值。比如12,翻倍后依次为24, 48, 96…。输入不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入为整型,空格分隔
输出格式:
输出为整型
样例1
输入:
12 3
输出:
96
(2)参考代码
#include<stdio.h>
int main() 
{
    int N, M;
    scanf("%d %d", &N, &M);
    for (int i=0;i<M;i++)
    {
        N *= 2;
    }
    printf("%d", N);
    return 0; 
}
MT1193 偶数的平方和
(1)题目
 输入正整数N,求前N个偶数的平方和。不考虑溢出。
格式
输入格式:
输入正整数N
输出格式:
输入整型
样例1
输入:
3
输出:
56
备注
本题第一个偶数从2起算
(2)参考代码
#include<stdio.h>
int main() 
{
    int N, i, sum = 0;
    scanf("%d", &N);
    for (i=2;i<=2*N;i)
    {
        sum += i * i;
        i += 2;
    }
    printf("%d\n", sum);
    return 0; 
}
MT1194 奇数的平方和
(1)题目
 输入正整数N,求前N个奇数的平方和。不考虑溢出。
格式
输入格式:
输入正整数N
输出格式:
输入整型
样例1
输入:
3
输出:
35
(2)参考代码
#include<stdio.h>
int main() 
{
    int N, i, sum = 0;
    scanf("%d", &N);
    for (i = 1; i <= 2 * N - 1; i)
    {
        sum += i * i;
        i += 2;
    }
    printf("%d\n", sum);
    return 0; 
}
MT1195 公式求和
(1)题目
 输入正整数N和M,按照下列公式求和。
 
格式
输入格式:
输入整型,空格分隔
输出格式:
输出实型
样例1
输入:
2 4
输出:
0.42361
(2)参考代码
#include<stdio.h>
int main() 
{
    int N, M, i;
    double sum = 0;
    scanf("%d %d", &N, &M);
    for (i=N;i<=M;i++)
    {
        sum += 1.0/(i*i);
    }
    printf("%.5lf", sum);
    return 0; 
}
MT1196 阶乘
(1)题目
 请编写一个简单程序,输入正整数n,输出n的阶乘。
格式
输入格式:
输入整型
输出格式:
输出整型 
样例1
输入:
5
输出:
5!=120
(2)参考代码
#include<stdio.h>
int main() 
{ 
    int n, sum = 1;
    scanf("%d", &n);
    for (int i=1;i<=n;i++)
    {
        sum *= i;
    }
    printf("%d!=%d", n, sum);
    return 0; 
}
MT1197 阶乘和
(1)题目
 求1!+2!+3!+…+n!
格式
输入格式:
输入为整型
输出格式:
输出为整型
样例1
输入:
5
输出:
153
(2)参考代码
#include<stdio.h>
int main() 
{ 
    int n, num, sum = 0;
    scanf("%d", &n);
    for (int i=1;i<=n;i++)
    {
        num = 1;
        for (int j=1;j<=i;j++)
        {
            num *= j;
        }
        sum += num;
    }
    printf("%d", sum);
    return 0; 
}
MT1198 阶乘差
(1)题目
 求1!-2!-3!-…-n!
格式
输入格式:
输入为整型
输出格式:
输出为整型
样例1
输入:
5
输出:
-151
(2)参考代码
#include<stdio.h>
int main() 
{ 
    int n, num, sum = 2;
    scanf("%d", &n);
    for (int i=1;i<=n;i++)
    {
        num = 1;
        for (int j=1;j<=i;j++)
        {
            num *= j;
        }
        sum -= num;
    }
    printf("%d", sum);
    return 0; 
}
MT1199 公式计算
(1)题目
 输入正整数n和r,计算公式 (n!) / (n-r)!。
格式
输入格式:
输入整型,空格分隔。
输出格式:
输出实型,保留2位小数。
样例1
输入:
2 1
输出:
2.00
(2)参考代码
#include<stdio.h>
int main() 
{ 
    int n, r, i;
    scanf("%d %d", &n, &r);
    double num1 = 1, num2 = 1;
    for (i=1;i<=n;i++)
    {
        num1 *= i;
    }
    for (i=1;i<=(n-r);i++)
    {
        num2 *= i;
    }
    printf("%.2lf\n", num1 / num2);
    return 0; 
}
MT1200 常数e
(1)题目
 常数e的值可以表示为无穷级数: e=1+1/1!+1/2!+1/3! +… 1/n!编写一个程序,计算e的值,其中n是用户输入的整数。输入不考虑0,负数或者其他特殊情况。
格式
输入格式:
输入整型,空格分隔。
输出格式: 
输出实型,保留2位小数。
样例1
输入格式: 
7
输出格式: 
2.72
(2)参考代码
#include<stdio.h>
int main() 
{ 
    int n, sum;
    double e = 1;
    scanf("%d", &n);
    for (int i=1;i<=n;i++)
    {
        sum = 1;
        for (int j=1;j<=i;j++)
        {
            sum *= j;
        }
        e += 1.0 / sum;
    }
    printf("%.2lf", e);
    return 0; 
}



















