1.计算一个数的阶乘
在做题过程中发现,使用scanf函数想要以此输入计算阶乘的数字时,程序无法运行,希望能在之后的学习中发现并解决这个问题,目前来看只能输入确定的数字常量才能够正常运行。
#include <stdio.h>
//计算一个数字的阶乘
int factorial(int a)
{
if(a == 0||a == 1)
{
return 1;
}
return a *factorial(a - 1);
}
int main()
{
int result = factorial(4);
printf("%d\n", result);
return 0;
}
2023/12/13
2.用1、2、3、4四个数组成互不相同且无重复数字的三位数
原来想创建一个数组来储存数字元素,再使用数组指针来表示结果的百位、十位、个位,但目前指针部分的学习还是不够熟练,对于for循环的三层嵌套结构还是有些许生疏,目前只能用当前代码段来实现这一问题了。
#include <stdio.h>
//1、2、3、4四个数,能组成多少互不相同且无重复数字的三位数
int main()
{
int first = 0;//初始化百位
int middle = 0;//初始化十位
int last = 0;//初始化个位
int result = 0;//设置一个变量来储存最终的结果
//利用三层for循坏来遍历1、2、3、4这四个数
for (first = 1; first < 5; first++)//百位依次增大
{
for (middle = 1; middle < 5; middle++)//十位依次增大
{
for (last = 1; last < 5; last++)//个位依次增大
{
if (first != middle && first != last && middle != last)//百位、十位、个位有重复则不输出,转下次循环
{
result = first * 100 + middle * 10 + last;//计算最终所得的数字
printf("%d\t", result);//输出结果
}
else
continue;
}
}
}
return 0;
}
2023/12/14
3.根据月利润计算企业发放奖金额度
针对这个问题原先是准备用switch函数来确定条件判断变量key的值的,但发现switch函数下的case只能写常量,不能用于作为条件判断key的值,所以设置了一个if语句来判断,但这个解决方法应该不是最优解,还存在优化的空间。
#include <stdio.h>
// // 题目:企业发放的奖金根据利润提成。
// #利润(I) 低于或等于10万元时,奖金可提10 % ;
// #利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5% ;
// # 20万到40万之间时,高于20万元的部分,可提成5%;
// # 40万到60万之间时高于40万元的部分,可提成3%;
// # 60万到100万之间时,高于60万元的部分,可提成1.5%;
// #高于100万元时,超过100万元的部分按1%提成。
// 从键盘输入当月利润I,求应发放奖金总数?
int main()
{
int I = 0; // 设置利润变量
double result; // 设置最终的发放奖金总数
int key; // 设置条件判断变量,判断利润处于哪种情况
scanf("%d", &I); // 输入奖金数
if (I <= 100000) // 判断利润区间
key = 1;
else if (I > 100000 && I < 200000)
key = 2;
else if (I >= 200000 && I < 400000)
key = 3;
else if (I >= 400000 && I < 600000)
key = 4;
else if (I >= 600000 && I < 1000000)
key = 5;
else
key = 6;
while (1) // 需设置循环保证break语句的生效,否则会输出其他case的printf语句
{
switch (key) // 多重选择语句,筛选奖金总数等等计算方法
{
case 1:
result = I * 1.1;
printf("本月应发奖金总数为%lf元", result);
break; // 该break只能跳出switch语句,但不能跳出while循环
case 2:
result = (I % 100000) * 0.075 + (I - I % 100000) * 0.1 + I;
printf("本月应发奖金总数为%lf元", result);
break;
case 3:
result = (I % 200000) * 0.05 + I;
printf("本月应发奖金总数为%lf元", result);
break;
case 4:
result = (I % 400000) * 0.03 + I;
printf("本月应发奖金总数为%lf元", result);
break;
case 5:
result = (I % 600000) * 0.015 + I;
printf("本月应发奖金总数为%lf元", result);
break;
case 6:
result = (I % 1000000) * 0.01 + I;
printf("本月应发奖金总数为%lf元", result);
break;
}
break; // 该break在switch语句外,用于跳出while循环
}
return 0;
}
2023/12/15
4.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数请问该数是多少
解决这个问题,主要是考验数学上对于未知数的转换和关系式的化简,搞清楚题目中变量之间的相关关系非常重要。
#include <stdio.h>
#include <math.h>
/*题目:一个整数,它加上100后是一个完全平方数,
再加上168又是一个完全平方数请问该数是多少*/
/*题目大意:
{
x + 100 = n^2
x + 100 + 168 = m^2
}
将x消元后,得m^2 - n^2 = 168
化简一下得(m + n)(m - n) = 168
因此将i = m + n、j = m - n
原式变为i * j = 168
由此得 m = (i + j) / 2; n = (i - j) / 2
*/
//思路:整数x不好用常规方法求得,题目中有3个未知数,但只有两个关系式
//无法正确求得整数x与两个完全平方数m、n的值,只能通过计算机枚举的方式求得
//我们所需要的就是简化关系式和求出取值范围
int main()
{
int m;int n;//设置两个平方数的初始值
int i = m + n;int j = m - n;//化简表达式中的m、n
for (i; i <= 168 / 2;i++)// 用for循环遍历符合i<=168的全部整数,来找到符合条件的整数
{
if (168 % i == 0)//在符合条件的数中筛选能够被168整除的数
{
j = 168 / i;//由i * j = 168变式而来
m = (i + j) / 2;
n = (i - j) / 2;
printf("x = %d\t", n * n - 100);//输出x的值
}
}
return 0;
}
2023/12/16
5.输入某年某月某日,判断这一天是一年中的第几天?
解决这个问题,得先明确年份有平年与闰年之分,如何区分闰年和平年,需要使用条件判断语句if,其次,每个月的天数应如何表示,如果是暴力破解的话可以每个月都设置变量值(如1月设置为int moon1 = 31),这样虽然直观,但代码繁琐且不容易管理,为了方便管理和简化,拿数组来转载个人认为是最优解,代码如下:
#include <stdio.h>
#include <math.h>
// 问题:输入某年某月某日,判断这一天是一年中的第几天?
/*
思路:
1.判断该年是平年还是闰年
2.设置数组来转入1~12月每个月的天数
3.用scanf函数来输入某年某月某日
4.用for循环遍历数组
*/
int main()
{
int year = 0;//年份
int moon = 0;//月份
int day = 0;//日期
int add = 0;//计算是本年的第几天
int CommonYear[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//平年每月的日期
int IntercalaryYear[] = {0,31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//闰年每月的日期
scanf("%d/%d/%d", &year, &moon, &day);//从外部输入年月日
for (moon; moon>=0; moon--)//使用for循环来计算该天是第几天
{
if (year % 4 != 0)//如果是闰年
add = CommonYear[moon - 1] + add;//moon-1是由于本月还没有过完,先计算先前月份
else
add = IntercalaryYear[moon - 1] + add;
}
add = day + add;//加上本月的剩余天数
printf("今天是今年的第%d天", add);
return 0;
}
2023/12/17
6.输入3个整数x、y、z,请把这三个数由大到小输出
解决这个问题,我们需要明确应先用scanf函数输入这3个整数