算法竞赛入门【码蹄集新手村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;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
RSA算法是一种非对称加密算法,它的安全性基于大数分解的困难性。在实现RSA算法时,需要大数运算的支持,因此需要使用高精度数的库。 以下是使用C语言实现大数RSA算法的步骤: 1. 生成两个大素数p和q,计算n=p*q。 2. 计算欧拉函数φ(n)=(p-1)*(q-1)。 3. 选择一个整数e,1<e<φ(n),且e和φ(n)互质。 4. 计算d,使得d*e ≡ 1 (mod φ(n)),即d是e在模φ(n)下的逆元。 5. 公钥为(n, e),私钥为(n, d)。 6. 加密:将明文m转换成整数M,计算密文c=M^e mod n。 7. 解密:将密文c计算出明文m=c^d mod n。 下面是一个简单的示例代码,使用了GMP库进行大数运算: ```c #include <stdio.h> #include <gmp.h> void generate_keys(mpz_t p, mpz_t q, mpz_t n, mpz_t e, mpz_t d, mpz_t phi); void encrypt(mpz_t c, mpz_t m, mpz_t e, mpz_t n); void decrypt(mpz_t m, mpz_t c, mpz_t d, mpz_t n); int main() { mpz_t p, q, n, e, d, phi, m, c; mpz_init(p); mpz_init(q); mpz_init(n); mpz_init(e); mpz_init(d); mpz_init(phi); mpz_init(m); mpz_init(c); // generate keys generate_keys(p, q, n, e, d, phi); // encrypt mpz_set_ui(m, 123456789); encrypt(c, m, e, n); gmp_printf("ciphertext: %Zd\n", c); // decrypt decrypt(m, c, d, n); gmp_printf("plaintext: %Zd\n", m); mpz_clear(p); mpz_clear(q); mpz_clear(n); mpz_clear(e); mpz_clear(d); mpz_clear(phi); mpz_clear(m); mpz_clear(c); return 0; } void generate_keys(mpz_t p, mpz_t q, mpz_t n, mpz_t e, mpz_t d, mpz_t phi) { gmp_randstate_t state; gmp_randinit_mt(state); mpz_urandomb(p, state, 512); mpz_urandomb(q, state, 512); mpz_nextprime(p, p); mpz_nextprime(q, q); mpz_mul(n, p, q); mpz_sub_ui(p, p, 1); mpz_sub_ui(q, q, 1); mpz_mul(phi, p, q); mpz_set_ui(e, 65537); mpz_invert(d, e, phi); } void encrypt(mpz_t c, mpz_t m, mpz_t e, mpz_t n) { mpz_powm(c, m, e, n); } void decrypt(mpz_t m, mpz_t c, mpz_t d, mpz_t n) { mpz_powm(m, c, d, n); } ``` 在实际应用中,需要考虑到更多的安全性问,如选择更长的密钥长度、使用随机数生成器等。此外,还需要考虑到大数运算的效率问,可以使用一些优化算法来提高运算速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥轩_521

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值