OJ刷题之旅(5)

简介: OJ刷题

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 &lt;= 100; cock++)
{
    for (hen = 1; hen &lt;= 100 - cock; hen++)
    {
        chick = 100 - cock - hen;
        if (chick &gt; 0 &amp;&amp; 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 &lt;= 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", &amp;T);
while(T--) {
    scanf("%s", str);
    int len = strlen(str);
    for(int i = len - 1; i &gt;= 0; i--) {
        printf("%c", str[i]);
    }
    printf("\n");
}
return 0;
}

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


目录
相关文章
|
1月前
|
算法 容器
OJ刷题日记:2、双指针(2)
OJ刷题日记:2、双指针(2)
18 0
|
2天前
|
容器
【LeetCode刷题】栈和队列题目练习~
【LeetCode刷题】栈和队列题目练习~
|
1月前
|
算法 测试技术
OJ刷题日记:1、双指针(1)
OJ刷题日记:1、双指针(1)
22 0
|
1月前
刷题之Leetcode206题(超级详细)
刷题之Leetcode206题(超级详细)
24 0
刷题之Leetcode206题(超级详细)
|
1月前
|
人工智能
刷题之Leetcode977题(超级详细)
刷题之Leetcode977题(超级详细)
10 0
|
1月前
|
索引
leetcode151刷题打卡
leetcode151刷题打卡
20 0
|
1月前
leetcode383刷题打卡
leetcode383刷题打卡
17 0
|
1月前
leetcode203刷题打卡
leetcode203刷题打卡
452 0
OJ刷题之旅(4)
OJ刷题之旅(4)
35 0
|
C语言
OJ刷题之旅(3)
OJ刷题之旅(3)
71 0

热门文章

最新文章