算法竞赛入门【码蹄集新手村600题】(MT1160-1180)C语言

算法竞赛入门【码蹄集新手村600题】(MT1160-1180)C语言

  • 目录
    • MT1161 N的零
    • MT1162 数组最大公约数
    • MT1163 孪生质数
    • MT1164 最大数字
    • MT1165 卡罗尔数
    • MT1166 自守数
    • MT1167自守数II
    • MT1168 阶乘数
    • MT1169 平衡数
    • MT1170 四叶玫瑰数
    • MT1171 幻数
    • MT1172 完美数字
    • MT1173 魔数
    • MT1174 A的B次方
    • MT1175 网球比赛
    • MT1176 两个点的距离
    • MT1177 三角形
    • MT1178 点与线段的关系
    • MT1179 线段与线段的关系
    • MT1180 两条线段

在这里插入图片描述
码蹄集网站地址:https://www.matiji.net/exam/ojquestionlist


目录

MT1161 N的零

(1)题目
输入正整数N,将N的所有零转换为5。没有0就原样输出。不考虑不合理的输入等特殊情况。


格式

输入格式:
输入正整数N


输出格式:
输出整型

样例1

输入:
5002

输出:
5552

(2)参考代码

#include
#include
int main() 
{ 
    char a[100];
    scanf("%s", &a);
    for (int i=0;i<strlen(a);i++)
    {
        if (a[i] == '0')
        {
            a[i] = '5';
        }
    }
    printf("%s", a);
    return 0; 
}

MT1162 数组最大公约数

(1)题目
给定一个由N个正整数组成的数组,求所有数组元素的最大公约数。


格式

输入格式: 
第一行输入数组长度N,第二行输入数组元素,整型,空格分隔。

输出格式: 
输出整型

样例1

输入格式:
3
2 4 6

输出格式:
 2

(2)参考代码

#include
int main() 
{ 
    int N;
    scanf("%d", &N);
    int a[N];
    for (int i=0;i<N;i++)
    {
        scanf("%d", &a[i]);
    }
    int min = a[0], flag;
    for (int i=0;i<N;i++)
    {
        if (min < a[i])
        {
            min = a[i];
        }
    }
    for (int i=min;i>=1;i--)
    {
        flag = 1;
        for (int j=0;j<N;j++)
        {
            if (a[j] % i != 0)
            {
                flag = 0;
                break;
            }
        }
        if (flag == 1)
        {
            printf("%d", i);
            break;
        }
    }
    return 0; 
}

MT1163 孪生质数

(1)题目
在质数中,若两个质数之差为2,我们称之为孪生质数,例如(3、5)(5、7),输入2个正整数,判断他是不是孪生质数,输出YES或者NO。


格式

输入格式:
输入整型


输出格式:
输出YES或者NO

样例1

输入:
2 6

输出:
NO

(2)参考代码

#include
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    if ((b - a == 2 || a - b == 2) && (a != 0 && b != 0) && (a != 1 && b != 1))
    {
        for (int i=2;i<a;i++)
        {
            if (a % i == 0)
            {
                printf("NO");
                return 0;
            }
            for (int i=2;i<b;i++)
            {
                if (b % i == 0)
                {
                    printf("NO");
                    return 0;
                }
            }
        }
    }
    else
    {
        printf("NO");
        return 0;
    }
    printf("YES");
    return 0;
}

MT1164 最大数字

(1)题目
输入正整数N,找到小于或等于它的最大数字,并且其数字从高位到低位是非递减的顺序。


格式

输入格式:
 输入正整数N

输出格式: 
输出整型

样例1

输入格式: 
200

输出格式: 
199

(2)参考代码

#include
int main() 
{ 
    int n;
    scanf("%d", &n);
    int temp = n, min = temp % 10, flag = 1;
    while (temp)
    {
        if (temp % 10 <= min)
        {
            min = temp % 10;
        }
        else
        {
            flag = 0;
        }
        temp /= 10;
    }

    if (flag == 1)
    {
        printf("%d", n);
    }
    else
    {
        for (int i=n;i>0;i--)
        {
            temp = i;
            flag = 1;
            min = temp % 10;
            while (temp)
            {
                if (temp % 10 <= min)
                {
                    min = temp % 10;
                }
                else
                {
                    flag = 0;
                }
                temp /= 10;
            }
            if (flag == 1)
            {
                printf("%d", i);
                break;
            }
        }
    }
    return 0; 
}

MT1165 卡罗尔数

(1)题目
卡罗尔数是其值满足4n-2 (n+1) -1的整数(n为正整数)。输入正整数N判断它是不是卡罗尔数,输出YES或者NO。


格式

输入格式: 
输入正整数N

输出格式: 
输出YES或者NO

样例1

输入格式: 
1

输出格式: 
YES

(2)参考代码

#include
int main() 
{ 
    int N, num;
    scanf("%d", &N);
    for (int i=2;;i++)
    {
        num = 2 * i - 3;
        if (num == N)
        {
            printf("YES");
            break;
        }
        else if (num > N)
        {
            printf("NO");
            break;
        }
    }
    return 0; 
}

MT1166 自守数

(1)题目
输入正整数N (N<10),判断该数是否为自守数输出YES或者NO。当且仅当一个数的平方以与该数相同的数字结尾时,该数称为自守数。


格式

输入格式: 
输入正整数N

输出格式: 
输出YES或者NO

样例1

输入格式:
 5

输出格式: 
YES

(2)参考代码

#include
int main() 
{ 
    int N, n, temp_N, temp_n;
    scanf("%d", &N);
    int temp = N, count = 0;
    n = N * N;
    while (temp)
    {
        temp /= 10;
        count++;
    }
    for (int i=0;i<count;i++)
    {
        temp_N = N % 10;
        temp_n = n % 10;
        if (temp_N != temp_n)
        {
            printf("NO");
            return 0;
        }
        N /= 10;
        n /= 10;
    }
    printf("YES");
    return 0; 
}

MT1167自守数II

(1)题目
输入正整数N,检查该数是否为自守数输出YES或者NO。当且仅当一个数的平方以与该数相同的数字结尾时,该数称为自守数。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
76

输出:
YES

(2)参考代码

#include
int main() 
{ 
    int N;
    scanf("%d", &N);
    int NN = N * N;

    while (N)
    {
        if (N % 10 != NN % 10)
        {
            printf("NO");
            return 0;
        }
        N = N / 10;
        NN = NN / 10;
    }
    printf("YES");
    return 0; 
}

MT1168 阶乘数

(1)题目
输入正整数N,找出它是否是一个等于其他数的阶乘值的数,输出YES或者NO。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
5

输出:
NO

(2)参考代码

#include
int main() 
{ 
    int N, num = 1, i;
    scanf("%d", &N);

    // for (i=1;i<=N;i++)
    // {
    //     num *= i;
    //     if (num == N)
    //     {
    //         printf("YES");
    //         return 0;
    //     }
    // }
    for (i=1;i<=(N/2)+1;i++)
    {
        num *= i;
        if (num == N)
        {
            printf("YES");
            return 0;
        }
    }
    printf("NO");
    return 0; 
}

MT1169 平衡数

(1)题目
输入一个正整数,它有N位数,N是大于1的奇数,判断它是不是平衡数。如果左侧的所有数字和等于右侧的所有数字之和,则称为平衡数。不考虑不合理的输入等特殊情况。


格式

输入格式: 
输入正整数N

输出格式: 
输出YES或者NO

样例1

输入格式: 
1234006

输出格式: 
YES

(2)参考代码

#include
int main() 
{ 
    int N;
    scanf("%d", &N);
    int temp = N, count = 0, sum1 = 0, sum2 = 0;
    while (temp)
    {
        temp /= 10;
        count++;
    }
    if (count == 1)
    {
        printf("YES");
    }
    else
    {
        for (int i=1;i<=count;i++)
        {
            if (i < (count - 1) / 2 + 1)
            {
                sum1 += N % 10;
            }
            else if (i > (count - 1) / 2 + 1)
            {
                sum2 += N % 10;
            }
            N /= 10;
        }
    }
    if (sum1 == sum2)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1170 四叶玫瑰数

(1)题目
输入正整数N,判断它是不是一个四叶玫瑰数,输出YES或者NO。四位玫瑰数是4位数的自幂数,它的每个位上的数字的4次幂之和等于它本身。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
1634

输出:
YES

(2)参考代码

#include
#include
int main() 
{ 
    int N, sum = 0;
    scanf("%d", &N);
    int temp = N;

    while (temp)
    {
        sum += pow((double)(temp % 10), 4.0);
        temp /= 10;
    }
    if (N == sum && (N >= 1000 && N <= 9999))
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1171 幻数

(1)题目
一个数字,把他的各位数累加会得到一个新的数字,再把这个新数字的每一位加起来,重复这个过程,直到只剩下一位数字,如果最后剩下的数字是1,就称原数为一个幻数。输入正整数N,检查它是否是一个幻数,输出YES或者NO。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
1234

输出:
YES

(2)参考代码

#include
int LeiJia(int num)
{
    int sum = 0;
    while (num)
    {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}
int main() 
{ 
    int N;
    scanf("%d", &N);
    while (N >= 10)
    {
        N = LeiJia(N);
    }
    if (N == 1)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1172 完美数字

(1)题目
输入正整数N,检查它是否完美输出YES或者NO。把一个数字的每一位拆分开,计算他们的阶乘再累加,如果和等于原数字,则该数字是完美的。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO


样例1

输入:
145

输出:
YES

(2)参考代码

#include
int main() 
{ 
    int N, i;
    scanf("%d", &N);
    int num, sum = 0, temp = N;
    while (temp)
    {
        num = 1;
        for (i=1;i<=temp%10;i++)
        {
            num *= i;
        }
        sum += num;
        temp /= 10;
    }
    if (sum == N)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1173 魔数

(1)题目
一个数字,把他乘以二,会得到一个新的数字,如果这个新数字依然由原数中那些数字组成,就称原数为一个魔数。输入正整数N,检查它是否是一个魔数,输出YES或者NO。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
142857

输出:
YES

(2)参考代码

#include
int main() 
{ 
    int N;
    scanf("%d", &N);
    int temp1, temp2 = N / 2, flag;
    while (temp2)
    {
        temp1 = N;
        flag = 0;
        while (temp1)
        {
            if (temp1 % 10 == temp2 % 10)
            {
                flag = 1;
            }
            temp1 /= 10;
        }
        if (flag != 1)
        {
            printf("NO");
            return 0;
        }
        temp2 /= 10;
    }
    printf("YES");
    return 0; 
}

MT1174 A的B次方

(1)题目
输入正整数N,判断它是否可以表示为A的B次方,其中B>1,A>0,都是整数。输出YES或者NO。


格式

输入格式:
输入正整数N


输出格式:
输出YES或者NO

样例1

输入:
6

输出:
NO

(2)参考代码

#include
#include
int main()
{
    int N, i, j;
    scanf("%d", &N);
    for (i = 1; i <= sqrt(N) + 1; i++)
    {
        for (j = 2; j <= sqrt(N) + 1; j++)
        {
            if (pow(i, j) == N)
            {
                printf("YES");
                return 0;
            }
        }
    }
    printf("NO");
    return 0;
}

MT1175 网球比赛

(1)题目
两个网球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三对赛手的名单。


格式

输入格式: 
无

输出格式: 
分3行输出,见样例

样例1

输入格式: 
无

输出格式:
a with z
b with x
c with y

(2)参考代码

#include
int main() 
{ 
    char a[2][3] = {{'a', 'b', 'c'}, {'x', 'y', 'z'}};
    for (int i=3;i<=3;i++)
    {
        for (int j=1;i<=3;j++)
        {
            for (int k=2;k<=2;k++)
            {
                if (i != j && j != k && i != k)
                {
                    printf("%c with %c\n", a[0][0], a[1][i-1]);
                    printf("%c with %c\n", a[0][1], a[1][j-1]);
                    printf("%c with %c", a[0][2], a[1][k-1]);
                    return 0;
                }
            }
        }
    }
    return 0; 
}

MT1176 两个点的距离

(1)题目
给定笛卡尔平面上两个点的坐标,求它们之间的距离向上舍入为最接近的整数。


格式

输入格式:
输入整型,空格分隔


输出格式:
输出整型

样例1

输入:
0 0 2 -2

输出:
3

(2)参考代码

#include
#include
int main() 
{ 
    int x1, x2, y1, y2;
    scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
    // printf("%.0lf\n", sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2)));
    int sum = pow(x1 - x2, 2) + pow(y1 - y2, 2);
    int num = sqrt(sum);
    if (num * num == sum)
    {
        printf("%d\n", num);
    }
    else
    {
        printf("%d\n", num + 1);
    }
    return 0; 
}

MT1177 三角形

(1)题目
输入三角形的三个顶点坐标,和点N的坐标。判断N是否位于三角形内,输出YES或者NO。


格式

输入格式: 
第一行输入三角形的三个顶点坐标(x1,y1) , (x2,y2)和(x3,y3),第二行输入点N的坐标,整型,空格分隔。

输出格式:
 输出YES或者NO

样例1

输入格式:
0 0 20 0 10 30
10 15

输出格式: 
YES

(2)参考代码

#include
#include
int main() 
{ 
    int x1, y1, x2, y2, x3, y3;
    int xN, yN;
    scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);
    scanf("%d %d", &xN, &yN);
    double S, S1, S2, S3;
    S = (double)(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2) * 0.5;
    S1 = (double)(x1*yN+xN*y3+x3*y1-x1*y3-xN*y1-x3*yN) * 0.5;
    S2 = (double)(xN*y2+x2*y3+x3*yN-xN*y3-x2*yN-x3*y2) * 0.5;
    S3 = (double)(x1*y2+x2*yN+xN*y1-x1*yN-x2*y1-xN*y2) * 0.5;
    if (S < 0 || S1 < 0 || S2 < 0 || S3 < 0)
    {
        S = sqrt(S * S);
        S1 = sqrt(S1 * S1);
        S2 = sqrt(S2 * S2);
        S3 = sqrt(S3 * S3);
    }
    if (S < S1 + S2 + S3)
    {
        printf("NO");
    }
    else if (S == S1 + S2 + S3)
    {
        printf("YES");
    }
    return 0; 
}

MT1178 点与线段的关系

(1)题目
输入线段的2个端点的坐标值x和y,再输入第3个点的坐标,判断点在不在线段上,输出YES或者NO。


格式

输入格式:
按照先起点(x,y)再终点(x,y)的次序。第二行输入第3个点的坐标。坐标整型。第一行两点之间空格,如样例所示。


输出格式:
输出YES或者NO


样例1

输入:
(-20,20) (-20,-10)
(0,0) 

输出:
NO

(2)参考代码

#include
#include
int main() 
{ 
    double x1, y1, x2, y2, a, b;
    scanf("(%lf,%lf) (%lf,%lf) \n (%lf,%lf)", &x1, &y1, &x2, &y2, &a, &b);
    double xy = sqrt(pow(x1 - x2, 2.0) + pow(y1 - y2, 2.0));
    double xy1 = sqrt(pow(x1 - a, 2.0) + pow(y1 - b, 2.0));
    double xy2 = sqrt(pow(x2 - a, 2.0) + pow(y2 - b, 2.0));
    if (xy1 + xy2 == xy)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1179 线段与线段的关系

(1)题目
输入2个线段的端点的坐标值x和y,判断两条线是否为平行线。输出YES或者NO。另:不考虑共线情况。


格式

输入格式:
 输入整型,空格分隔。按照先起点(x,y),空格,再终点(x,y)的次序。每行一个线段的信息。

输出格式: 
输出YES或者NO

样例1

输入格式:
(-20,20) (-20,-10)
(0,0) (5,0)

输出格式: 
NO

(2)参考代码

#include
// #include
int main() 
{ 
    int x1, y1, x2, y2;
    int x3, y3, x4, y4;
    scanf("(%d,%d) (%d,%d)\n", &x1, &y1, &x2, &y2);
    scanf("(%d,%d) (%d,%d)", &x3, &y3, &x4, &y4);
    // if ((x1 == x2 && x3 == x4) || (y1 == y2 && y3 == y4))
    // {
    //     printf("YES");
    //     return 0;
    // }
    // double tan1, tan2;
    // tan1 = sqrt(pow((double)(y2 - y1), 2.0)) / sqrt(pow((double)(x2 - x1), 2.0));
    // tan2 = sqrt(pow((double)(y4 - y3), 2.0)) / sqrt(pow((double)(x4 - x3), 2.0));
    // if (tan1 == tan2)
    // {
    //     printf("YES");
    // }
    // else
    // {
    //     printf("NO");
    // }
    if (x1 == x2 && x3 == x4 || y1 == y2 && y3 == y4)
    {
        printf("YES");
    }
    else if ((y2 - y1) / (x2 - x1) == (y4 - y3) / (x4 - x3))
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0; 
}

MT1180 两条线段

(1)题目
输入2个线段的端点的坐标值x和y (x,y不重合),判断两条线段是否交叉,输出YES或者NO。


格式

输入格式: 
输入整型,空格分隔。按照先起点(x,y),空格,再终点(x,y))的次序。每行一个线段的信息。

输出格式: 
输出YES或者NO

样例1

输入格式:
(-20,20) (-20,-10)
(0,0) (5,0)

输出格式:
 NO

(2)参考代码

#include
int main() 
{ 
    int x1, y1, x2, y2;
    int x3, y3, x4, y4;
    scanf("(%d,%d) (%d,%d)/n", &x1, &y1, &x2, &y2);
    scanf("(%d,%d) (%d,%d)", &x3, &y3, &x4, &y4);
    if (x1 == x2 && x3 == x4 || y1 == y2 && y3 == y4)
    {
        printf("NO");
    }
    else if ((y2 - y1) / (x2 - x1) == (y4 - y3) / (x4 - x3))
    {
        printf("NO");
    }
    else
    {
        printf("YES");
    }
    return 0; 
}

你可能感兴趣的:(玥轩算法,算法,c语言,开发语言,数据结构,蓝桥杯,码蹄杯)