【C#】C语言做题集(目前持续更新)

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个整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值