OJ刷题

汽水瓶

题目描述 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入 输入文件最多包含300组测试数据,每个数据占一行,仅包含一个正整数n(1 <= n <= 100),表示小张手上的空汽水瓶数。n = 0表示输入结束,你的程序不应当处理这一行。 输出 对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。 样例输入 Copy 3 10 81 0 样例输出 Copy 1 5 40

以下是一个C语言程序,可以计算并输出小张最多可以喝到的汽水瓶数:

#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) == 1 && n != 0) {
        int ans = 0; // 初始化最多可以喝到的汽水瓶数
        while (n >= 3) { // 只要还有至少三个空汽水瓶
            ans += n / 3; // 将n个空汽水瓶换成n/3瓶汽水
            n = n % 3 + n / 3; // 剩余的空瓶子数量为 n%3 加上已经换来的汽水瓶数量
        }
        if (n == 2) { // 如果只剩下两个空汽水瓶
            ans++; // 可以向老板借一瓶汽水,将两个空瓶子和借来的一瓶汽水换成一瓶新的汽水
        }
        printf("%d\n", ans); // 输出最多可以喝到的汽水瓶数
    }
    return 0;
}

解析:

首先在程序开头包含了标准输入输出库的头文件 stdio.h。

然后在 main 函数中使用 while 循环读入多组测试数据,每次读入一个正整数 n。如果 n 等于0,则结束输入;否则开始计算最多可以喝到的汽水瓶数。

在计算过程中,使用一个变量 ans 来记录已经喝到的汽水瓶数,初始化为0。然后采用循环的方式,每次将至少三个空汽水瓶换成一瓶汽水,并累加到 ans 变量中。如果剩余的空汽水瓶数量不足3个,则退出循环。

最后判断剩余的空汽水瓶数量,如果有2个,则可以向老板借一瓶汽水,将两个空瓶子和借来的一瓶汽水换成一瓶新的汽水,并将 ans 加1。

最后输出 ans 变量即可。

程序执行完毕后返回0,表示成功执行。

scanf("%d", &n) == 1 的含义是读取一个整数并将它存储到变量 n 中,如果成功读入一个整数则返回1,否则返回0。在这个程序中,使用 scanf 函数读入多组测试数据时,该语句的作用是判断是否成功读入了一个正整数并且该正整数不为0,如果满足条件则进行计算和输出,否则结束程序。

A+B

题目描述 输入两个正整数a,b 求a+b的和。(多组测试样例,输入到文件尾结束) 输入 两个正整数a,b。(0<a,b<=100000000000000000) 输出 每组数据a+b的和。 样例输入 Copy 1 2 2 3 3 4 1000000000 1000000000 样例输出 Copy 3 5 7 2000000000

以下是一个C语言程序,可以计算并输出两个正整数的和:

#include <stdio.h>

int main() {
    long long a, b; // 使用long long类型,可以处理较大的整数
    while (scanf("%lld%lld", &a, &b) == 2) { // 读入两个正整数
        printf("%lld\n", a + b); // 计算它们的和并输出
    }
    return 0;
}

解析:

首先在程序开头包含了标准输入输出库的头文件 stdio.h。

然后在 main 函数中使用 while 循环读入多组测试数据,每次读入两个正整数 a 和 b。如果成功读入,则计算它们的和,然后输出和值;否则结束程序。

在读入数据时,使用 %lld 格式符来读取 long long 类型的整数。

在输出结果时,使用 %lld 格式符将 long long 类型的和值格式化为字符串,并在字符串末尾添加换行符 \n,以免输出与下一行文字混在一起。

程序执行完毕后返回0,表示成功执行。

凑零钱

用1元,2元,5元,凑出20元的方案数; 如凑出5元:有5个1元、3个1元+1个2元、1个1元+2个2元、1个5元,共4种方案。 输入 无

以下是一个C语言程序,可以计算凑出20元的方案数:

#include <stdio.h>

int main() {
    int ans = 0; // 初始化方案数为0
    for (int i = 0; i <= 20; i += 5) { // 枚举5元硬币的个数
        for (int j = 0; j <= 20 - i; j += 2) { // 枚举2元硬币的个数
            ans++; // 每找到一种方案,就将方案数加1
        }
    }
    printf("%d\n", ans); // 输出方案数
    return 0;
}

解析:

首先在程序开头包含了标准输入输出库的头文件 stdio.h。

然后在 main 函数中使用两层循环枚举所有可能的方案。外层循环枚举5元硬币的个数,因为每个5元硬币都可以兑换成4个2元硬币,所以内层循环枚举2元硬币的个数时,最多只需要考虑10个2元硬币即可。

每找到一种方案,就将方案数 ans 变量加1。

最后输出方案数即可。

程序执行完毕后返回0,表示成功执行。

百钱买鸡

公鸡2文,母鸡1文,小鸡半文,每种至少一只,100文买100只鸡有多少种方案数

首先,我们可以使用三个for循环嵌套枚举公鸡、母鸡和小鸡的数量。其中,每只鸡至少有一只,因此我们可以将公鸡的数量从1开始枚举,然后在剩下的鸡中枚举母鸡的数量,最后计算出小鸡的数量。具体实现见下面的代码:

#include <stdio.h>

int main()
{
    int cock, hen, chick; // 公鸡、母鸡和小鸡的数量
    int count = 0; // 方案数

    for (cock = 1; cock <= 100; cock++)
    {
        for (hen = 1; hen <= 100 - cock; hen++)
        {
            chick = 100 - cock - hen;
            if (chick > 0 && cock * 2 + hen * 1 + chick * 0.5 == 100)
            {
                printf("公鸡:%d 只,母鸡:%d 只,小鸡:%d 只\n", cock, hen, chick);
                count++;
            }
        }
    }

    printf("%d\n", count);

    return 0;
}

这段代码中,我们使用了一个count变量来记录符合条件的方案数。在满足题目条件的情况下,输出每种方案的鸡的数量,并将count加1。最后输出总的方案数即可。

需要注意的是,小鸡的价格是半文,因此我们将它定义为浮点型变量,并在计算时将其乘以0.5。

分解质因子

题目描述 将一个正整数分解质因数,例如,输入90,输出2 3 3 5。 输入 输入一个正整数n(2<=n<=2000)。 输出 从小到大输出n的所有质因子,每两个数之间空一格。 样例输入 Copy 20 样例输出 Copy 2 2 5

ps:质因数 ≠ 为质数的因数,我因为这一点把题目想复杂了。

这道题可以使用循环来实现质因数分解。我们可以从2开始遍历到n,如果n能够被当前的数整除,则当前的数就是n的一个质因子。我们将其输出,并将n除以这个质因子,继续往下寻找质因子。直到n小于当前的数为止。

具体实现见下面的代码:

#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);

    int i;
    for (i = 2; i <= n; i++)
    {
        while (n % i == 0)
        {
            printf("%d ", i);
            n /= i;
        }
    }

    return 0;
}

在这段代码中,我们先读入一个正整数n。然后从2开始遍历到n,对于每个数i,如果n能够被i整除,则i是n的一个质因子,我们将其输出并将n除以i。这里使用了while循环,因为n可能包含多个相同的质因子。

需要注意的是,当n小于当前的数时,我们就不需要再继续往下寻找质因子了,因为此时已经将质因数全部找到了。

猴子吃桃

题目描述 悟空第一天摘下桃子若干,当即吃掉一半,还不过瘾,又多吃一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢? 输入 输入一个数n(1<=n<=30)。 输出 输出第一天的桃子个数。 样例输入 Copy 3 样例输出 Copy 10

以下是使用递归实现的C语言代码:

#include <stdio.h>

int peach(int n)
{
    if (n == 1) {
        return 1;
    } else {
        return 2 * (peach(n-1) + 1);
    }
}

int main()
{
    int n;
    scanf("%d", &n);

    printf("%d", peach(n) );

    return 0;
}

在这段代码中,我们定义了一个名为peach的函数,用来计算第 n 天前一天(即第 n - 1 天)的桃子数量。如果 n 等于 1,则返回 1;否则,递归地调用 peach(n-1),并根据题意计算出 x 的值。最后,在 main 函数中调用 peach 函数,并按照公式计算出第一天摘下的桃子数量并输出。

需要注意的是,递归实现比较简洁,但当 n 较大时容易导致栈溢出,因此需要谨慎使用。

字符翻转

题目描述 T组输入,把每组输入的字符串翻转后输出。(每组字符串长度小于1000,T小于1000) 样例输入 Copy 3 abcd 123 xmn 样例输出 Copy dcba 321 nmx

#include <stdio.h>
#include <string.h>

int main() {
    int T;
    char str[1001];

    scanf("%d", &T);

    while(T--) {
        scanf("%s", str);

        int len = strlen(str);
        for(int i = len - 1; i >= 0; i--) {
            printf("%c", str[i]);
        }
        printf("\n");
    }

    return 0;
}

在程序中,我们首先输入需要翻转的字符串的组数T,并使用while循环来处理每一组数据。在每一组数据中,我们输入需要翻转的字符串,并计算出字符串的长度len。然后使用for循环从字符串尾部开始遍历,逐个输出字符即可完成字符串的翻转。最后注意要添加换行符来换行,以便输出下一组数据。

OJ刷题之旅_质因子