猴子第一天摘下若干个桃子,当即吃了一半,还没有解馋,又多吃了一个 ,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半多一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
程序分析(逆向思维): 猴子从第一天摘下桃子后,第一天到第九天都是吃了原有桃子的一半然后又吃一个,然后第十天剩余一个桃子,那样第九天剩的桃子就等于低十天剩余的桃子加一后乘以二,然后循环九次便得到第一天摘得桃子。
#include <stdio.h>
int main()
{
int i=9,sum=1;//i表示天数,sum表示桃子数,第十天桃子剩余一个
for(i=9;i>0;i--)
{
sum=(sum+1)*2;
}
printf("猴子一共采摘了%d个桃子",sum);
return 0;
}
题目要求:从控制台输入圣诞树的高度,打印输出该圣诞树图形。
/*
*
***
*****
*******
从控制台输入树高度,打印对应圣诞树。
发现规律如下:
每行的星星数量 = (行号*2)-1
每行前面的空格数量 = 树的高度-行号。
**/
#include <stdio.h>
int main(void)
{
int high = 0;
printf("请输入圣诞树的高度:");
scanf("%d", &high);
for (int i = 0; i <= high; i++)
{
// 输出每行前面的空格
for (int j = 0; j < high - i; j++)
{
printf(" ");
}
// 输出每行的星星。
for (int k = 0; k < (2 * i - 1); k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
百钱百鸡问题。用100钱买100只鸡,公鸡一只五元,母鸡一只三元,小鸡三只一元,编程计算共有几种买法。
#include <stdio.h>
int main(void)
{
int gjNum; // 公鸡的数量
int mjNum; // 母鸡的数量
int xjNum; // 小鸡的数量
int iCount = 0;
for (gjNum = 0; gjNum <= 20; gjNum++)
{
for (mjNum = 0; mjNum <= 33; mjNum++)
{
for (xjNum = 0; xjNum <= 100; xjNum++)
{
// 小鸡必须是3的倍数
if (xjNum % 3 == 0)
{
if (gjNum * 5 + mjNum * 3 + xjNum / 3 == 100 && gjNum + mjNum + xjNum == 100)
{
iCount++;
printf("公鸡买%d只,母鸡买%d只,小鸡买%d只.\n",gjNum,mjNum,xjNum);
}
}
}
}
}
}
西安出租车的起步价为9元,其中起步价包括了3公里,之后每公里收费是2.5元,晚上22:00至次日凌晨6点加收1元钱。编写程序实现输入打车的时间和距离,计算本次打车的费用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int hour;//打车的时间,取整数即可。
int distance;//打车的距离公里数
double startPrice = 10.0; //默认起步价是10元
double totalPrice = 0.0; //总费用
printf("请输入打车的时间(0-23):");
scanf("%d", &hour);
printf("请输入打车的距离:");
scanf("%d", &distance);
printf("您本次打车是时间是:%d,打车的距离是:%d", hour, distance);
if (hour >= 7 && hour <= 21)
{
startPrice = 9.0;
}
if (distance <= 3)
{
totalPrice = startPrice;
}
else
{
totalPrice = startPrice + (distance - 3) * 2.5;
}
printf("您本次打车的总费用是:%.2lf", totalPrice);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 判断是否是闰年
int isRun(int year)
{
// 年份能被4整除,并且不能被100整除,或者能被400整除的年份,称为闰年。
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return 1;
}
return 0;
}
// 计算当月的总天数
int getMonthDays(int year, int month)
{
// 默认每个月都是31天。
int days = 31;
// 单独判断是否是小月即可。
switch (month)
{
case 2:
// 对于二月份要特殊对待。
if (isRun(year))
{
days = 29;
}
else
{
days = 28;
}
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
}
return days;
}
// 假设1900-1-1是星期一,算出这个月的第一天距离1900-1-1过了多少天
int getTotalDays(int year, int month)
{
int totalDays = 0;
// 循环年份
for (int i = 1900; i < year; i++)
{
if (isRun(i))
{
totalDays += 366;
}
else
{
totalDays += 365;
}
}
// 循环月份
for (int i = 1; i < month; i++)
{
totalDays += getMonthDays(year, i);
}
totalDays++;
return totalDays; // 这个月的第一天距离1900-1-1过了多少天。
}
void printCalendar(int week, int days)
{
// 打印日历的表头
printf("星期一\t\t星期二\t\t星期三\t\t星期四\t\t星期五\t\t星期六\t\t星期日\t\t\n");
int iCount = 0; // 计数器实现遇到7就换行。
// 循环前面的空格
for (int i = 1; i < week; i++)
{
iCount++;
printf("\t\t");
}
// 循环打印日历
for (int i = 1; i <= days; i++)
{
printf("%d\t\t", i);
iCount++;
if (iCount % 7 == 0)
{
printf("\n");
}
}
}
int main(int argc, char *argv[])
{
int year; // 输入的年份
int month; // 输入的月份
int days = 0; // 当月的总天数。
int totalDays = 0; // 该月的第一天距离1900-1-1过了多少天。
int week; // 表示这个月的第一天是星期几。
printf("请输入年份:");
scanf("%d", &year);
printf("请输入月份:");
scanf("%d", &month);
// 计算这个月的总天数
days = getMonthDays(year, month);
// 计算这个月的第一天,距离1900-1-1过了多少天
totalDays = getTotalDays(year, month);
// 计算这个月的第一天是星期几
week = totalDays % 7;
// 打印日历
printCalendar(week, days);
return 0;
}
运行效果:
请输入年份:2024
请输入月份:5
星期一 星期二 星期三 星期四 星期五 星期六 星期日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31