附加题:
1.空瓶换水问题属于数学运算中的一类问题,每4个空瓶子又能换1瓶水,喝掉以后比如有15瓶水,每喝完1瓶得到1个空瓶子,又得到1个空瓶子。那么最多能喝几瓶水?分析:我们想要的是喝到最多瓶水,而最后3个空瓶去换水的过程中,想要使空瓶发挥最大价值,我们不妨先和老板赊1瓶水,喝完后就有1个空瓶,加上之前剩下的3个空瓶,即可再换1瓶水还给老板,因此最多可以换到喝瓶水,所以最多喝了20瓶水。
现在有n瓶水,每 m(m <n)个空瓶能换 1瓶水,那么最多能喝多少瓶水?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 函数声明
int maxBottles(int initialBottles, int emptyBottlesForOneNew);
int main() {
int n, m;
// 输入初始瓶数和换瓶规则
printf("请输入初始瓶数n: ");
scanf("%d", &n);
printf("请输入每m个空瓶能换1瓶水: ");
scanf("%d", &m);
// 计算最多能喝多少瓶水
int result = maxBottles(n, m);
// 输出结果
printf("最多能喝 %d 瓶水\n", result);
return 0;
}
// 计算最多能喝多少瓶水的函数
int maxBottles(int initialBottles, int emptyBottlesForOneNew) {
int totalBottlesDrunk = initialBottles; // 初始喝掉的瓶数
int emptyBottles = initialBottles; // 初始空瓶数
// 当空瓶数足够换一瓶新水时,继续换水并喝掉
while (emptyBottles >= emptyBottlesForOneNew) {
int newBottles = emptyBottles / emptyBottlesForOneNew; // 能换的新瓶数
totalBottlesDrunk += newBottles; // 增加喝掉的瓶数
emptyBottles = emptyBottles % emptyBottlesForOneNew + newBottles; // 更新空瓶数(包括新喝掉后产生的空瓶)
// 如果空瓶数正好差一个能再换一瓶,可以赊一瓶来喝,最后还回去
if (emptyBottles == emptyBottlesForOneNew - 1) {
totalBottlesDrunk += 1;
emptyBottles = 1; // 喝完赊来的水后,剩下一个空瓶
}
}
return totalBottlesDrunk;
}
-
有0、1、2、3、4共5个数字 能组成多少个互不相同且无重复数字的3位数?并输出这些数(要求:5个数字一行)?并求出总个数?
-
100-999 全部的水仙花数?(如:153=1x1x1+5x5x5+3x3x3)?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int i, g, s, b;
for (i = 100; i <= 999; i++)
{
g = i % 10; //取出个位
s = i / 10 % 10;//取出十位
b = i / 100; //取出百位
if (i == g * g * g + s * s * s + b * b * b)
{
printf("%d 是水仙花数\n", i);
}
}
return 0;
}
- 由用户输入一个字符串(只能包含数字和字母),将字符串中的数字提取出来,如输入:agh1234jh5b67,输出1234567
#define _CRT_SECURE_NO_WARNINGS 1
//if 第一个if判断 数字和字母 第二个if判断,只接收数字,
// str1 str2
//通过循环来遍历数组,然后依次赋值
#include <stdio.h>
#include <string.h>
int main()
{
int j, k = 0;
char str1[100], str2[100];
printf("请输入字符串(只能包含数字和字母)\n");
gets(str1);
int len = strlen(str1);
for (j = 0; j < len; j++)
{
if (str1[j] >= '0' && str1[j] <= '9' || str1[j] >= 'A' && str1[j] <= 'Z' || str1[j] >= 'a' && str1[j] <= 'z')
{
if (str1[j] >= '0' && str1[j] <= '9')
{
str2[k] = str1[j];
k++;
}
}
else
{
printf("请重新输入\n");
return 1;
}
}
str2[k] = '\0';
puts(str2);
return 0;
}
- 输入处理
- 程序首先提示用户输入一个字符串,该字符串应只包含数字和字母。
- 使用
gets函数读取用户输入的字符串,并存储在str1中。
- 遍历字符串
- 使用一个
for循环遍历str1中的每个字符。 - 在循环内部,首先检查当前字符是否是数字、大写字母或小写字母。这是通过一系列的条件判断来实现的。
- 使用一个
- 数字提取
- 如果当前字符是数字(在第一个
if语句内部再次检查),则将该数字字符添加到str2中。 - 使用变量
k来跟踪str2中的当前位置,以便正确放置数字字符。
- 如果当前字符是数字(在第一个
- 输入验证
- 如果在遍历过程中遇到非数字或非字母字符,程序将打印错误消息并退出循环。
- 字符串结束符
- 在循环结束后,向
str2的末尾添加字符串结束符'\0'。
- 在循环结束后,向
- 输出结果
- 打印提取出的数字字符串
str2。
- 打印提取出的数字字符串
指针解法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char str[100] = { '\0' }, num[100] = { '\0' };
char* p = str;
int i = 0, j;
gets(str);
while (*p) {
if (*p >= '0' && *p <= '9')
{
num[i] = *p;
i++;
}
p++;
}
num[i] = '\0';
puts(num);
printf("\n");
return 0;
}
- 今天是今年的多少天
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
// 判断是否为闰年(返回1表示是闰年,返回0表示不是闰年)
// 这个函数相当于判断是否是闰年的逻辑值
int isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1;
}
return 0;
}
// 获取每个月的天数(考虑闰年,返回该月的天数为29天,如果是平年,则返回数组的28天)
int getDaysInMonth(int year, int month) {
int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month == 2 && isLeapYear(year)) {
return 29;
}
return daysInMonth[month - 1]; //因为输入的月份和数组下标不匹配,所以这里-1
}
int main() {
int year, month, day;
int dayOfYear = 0;
// 获取用户输入的日期
printf("请输入日期(年 月 日):");
scanf("%d %d %d", &year, &month, &day);
// 验证输入的月份和日期是否合法(通过条件判断处理)
if (month < 1 || month > 12) {
printf("输入的月份不合法!\n");
return 1; // 返回非0值表示程序异常结束
}
if (day < 1 || day > getDaysInMonth(year, month)) { //和数组中预存的日期数比较,比它大则出错
printf("输入的日期不合法!\n");
return 1; // 返回非0值表示程序异常结束
}
// 计算从年初到输入日期之前的天数
for (int i = 1; i < month; i++) { //因为计算的月份是当月的前几个月的相加,所以这里是i<month
dayOfYear += getDaysInMonth(year, i); //把年和月份传递给函数,进行判断
}
dayOfYear += day;
// 输出结果
printf("今天是今年的第 %d 天。\n", dayOfYear);
return 0; // 返回0表示程序正常结束
}
第二个版本(不装的版本)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int year, months, days;
int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
int i, sum = 0;
while (1)//做个死循环,不达成条件就重新输入
{
scanf("%d %d %d", &year, &months, &days);
if ((year > 0) && (months > 0 && months < 13) && (days > 0 && days <= 31))
{
if ((months == 2 || months == 4 || months == 6 || months == 9 || months == 11) && (days != 31) || (months > 0))
{
break;
}
}
printf("重新输\n");
}
for (i = 0; i < months - 1; i++) //把前几个月份的日子都叠加上,留下本月的天数
{
sum += a[i];
}
sum += days;//累加上这个月的天数
if (months > 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) //如果是闰年,那么再加一天,不是则直接打印
sum += 1;
printf("%d", sum);
return 0;
}
已老实版本:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() //判断今天是第几天?
{
int year, month, day, i, sum = 0, leapYearBool = 0;
int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
scanf("%d %d %d", &year, &month, &day);
for (i = 0; i < month - 1; i++)
sum += a[i];
sum += day;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
leapYearBool = 1;
if (leapYearBool && month > 2)
sum ++;
printf("%d\n", sum);
return 0;
}
- 用户输入三个数字,从大到小排序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int a, b, c, temp;
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{
temp = b;
b = a;
a = temp;
}
if (a < c)
{
temp = c;
c = a;
a = temp;
}
if (b < c)
{
temp = c;
c = b;
b = temp;
}
printf("%d %d %d\n", a, b, c);
return 0;
}
- 输入一行字符串,分别统计其中英文字母、空格、数字和其他字符
//输入一行字符串,分别统计其中英文字母、空格、数字和其他字符
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int i, letter = 0, space = 0, num = 0, another = 0;
gets(s);
int len = strlen(s);
for (i = 0; i < len; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z')
{
letter++;
}
else if (s[i] == ' ')
{
space++;
}
else if (s[i] >= '1' && s[i] <= '9')
{
num++;
}
else {
another++;
}
}
printf("您输入的字符串:\n英文字母有 %d 个 \n空格有 %d 个 \n数字有 %d 个 \n其他字符有 %d \n", letter, space, num, another);
return 0;
}
注意事项:
strlen()函数,需要引用头文件"string.h",用len变量来控制循环次数。
C语言编程附加题及输入处理问题
1991

被折叠的 条评论
为什么被折叠?



