C语言基础习题50例(一)1-5

CuterCorley
• 阅读 1570

虎为百兽尊,罔敢触其怒。 惟有父子情,一步一回顾。

习题1

有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

实现思路: 显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。 代码如下:

#include <stdio.h>

int main(){
    int i, j, k, n = 0;
    for(i = 1; i < 5; i++){
        for(j = 1; j < 5; j++){
            for(k = 1; k < 5; k++){
                if(i != j && i != k && j != k){
                    n++;
                    printf("%d%d%d", i, j, k);
                    if(n % 5){
                        printf(" ");
                    }
                    else{
                        printf("\n");
                    }
                }
            }
        }
    }
    printf("\n\nThere are %d numbers.\n", n);

    return 0;
} 

打印:

123 124 132 134 142
143 213 214 231 234
241 243 312 314 321
324 341 342 412 413
421 423 431 432

There are 24 numbers.

习题2

企业发放的奖金根据利润提成。利润 (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 ,求应发放奖金总数?

实现思路: 该题需要用到if条件判断或switch语句。

方式一——if语句:

#include <stdio.h>

int main(){
    long profit, bonus;
    float ratio;
    printf("Please input the profit:");
    scanf("%ld", &profit);
    if(profit > 0 && profit <= 100000){
        bonus = profit * 0.1;
    }
    else if(profit > 100000 && profit < 200000){
        bonus = 100000 * 0.1 + (profit - 100000) * 0.075;
    }
    else if(profit >= 200000 && profit < 400000){
        bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05;
    }
    else if(profit >= 400000 && profit < 600000){
        bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03;
    }
    else if(profit >= 600000 && profit < 1000000){
        bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015;
    }
    else{
        bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01;
    };
    printf("The bonus is %ld", bonus);

    return 0;
} 

打印:

Please input the profit:1234567
The bonus is 41845

方式二——switch语句:

#include <stdio.h>

int main(){
    long profit, bonus = 0;
    printf("Please input the profit:");
    scanf("%ld", &profit);
    int pr = profit / 100000;
    if(pr > 10){
        pr = 10;
    }
    switch(pr){
        case 0:
            bonus = profit * 0.1;break;
        case 1:
            bonus = 100000 * 0.1 + (profit - 100000) * 0.075;break;
        case 2:
        case 3:
            bonus = 100000 * 0.1 + 100000 * 0.075 + (profit - 200000) * 0.05;break;
        case 4:
        case 5:
            bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (profit - 400000) * 0.03;
        case 6:
        case 7:
        case 8:
        case 9:
            bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (profit - 600000) * 0.015;break;
        case 10:
            bonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (profit - 1000000) * 0.01;break;
        default:
            printf("Input Error!!\n");break;

    }
    printf("The bonus is %ld", bonus);

    return 0;
} 

效果与方式一相同。

习题3

一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?

实现思路: 方式一——使用简单循环:

#include <stdio.h>
#include <math.h>

int main(){
    int i;
    for(i = 0; i <= 100000; i++){
        int root1 = sqrt(i + 100), root2 = sqrt(i + 268);
        if(pow(root1, 2) == (i + 100) && pow(root2, 2) == (i + 268)){
            printf("%8d", i);
        }
    }
    printf("\n");

    return 0;
} 

打印:

      21     261    1581

方式二: 假设该数为 x。

  1. 则:x + 100 = n^2^, x + 100 + 168 = m^2^;
  2. 计算等式:m^2^ - n^2^ = (m + n)(m - n) = 168;
  3. 设m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数;
  4. 可得m = (i + j) / 2, n = (i - j) / 2,因为m、n为整数,所以i 和 j 要么都是偶数、要么都是奇数;
  5. 从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数;
  6. 由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1;
  7. 接下来将 i 的所有数字循环计算即可。
#include <stdio.h>

int main (void)
{
    int  i, j, n, x;
    for (i = 1; i < 168 / 2 + 1; i++){
        if (168 % i == 0){
            j = 168 / i;
            if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0){
                n = (i - j) / 2;
                x = n * n - 100;
                printf ("%8d", x);
            }
        }
    }
    printf("\n");

    return 0;
}

打印:

     -99      21     261    1581

显然,此时比方式一多了一个数-99,只要在方式一中i的初始值减小为-100即可。

习题4

输入某年某月某日,判断这一天是这一年的第几天?

实现思路: 假设月份为n,则天数为前n-1个月的天数加第n月的天数,如果n大于3时,要考虑是否为闰年,如果为闰年,则2月还要多加1天。

#include <stdio.h>

int main (void)
{
    int year, month, day, days, leap = 0;
    printf("Please input the date(YYYY_MM-DD):");
    scanf("%d-%d-%d", &year, &month, &day);
    switch(month){
        case 1:
            days = 0;break;
        case 2:
            days = 31;break;
        case 3:
            days = 59;break;
        case 4:
            days = 90;break;
        case 5:
            days = 120;break;
        case 6:
            days = 151;break;
        case 7:
            days = 181;break;
        case 8:
            days = 212;break;
        case 9:
            days = 243;break;
        case 10:
            days = 273;break;
        case 11:
            days = 304;break;
        case 12:
            days = 334;break;
        default:
            printf("Input Error");break;       
    }
    days += day;
    if(year % 4 ==0 && year % 100 != 0 || year % 400 == 0){
        leap = 1;
    }
    if(leap && month > 2){
        days += 1;
    }
    printf("Days = %d\n", days);

    return 0;
}

打印:

Please input the date(YYYY_MM-DD):2020-05-26
Days = 147

习题5

输入三个整数 x、y、z ,请把这三个数由小到大输出。

实现思路: 通过两两比较找出三者中最大和最小的数。

#include <stdio.h>

int main (void)
{
    int x, y, z, temp;
    printf("Please input 3 numbers:\n");
    scanf("%d %d %d", &x, &y, &z);
    if(x > y){
        temp = x;
        x = y;
        y = temp;
    }
    if(x > z){
        temp = x;
        x = z;
        z = temp;
    }
    if(y > z){
        temp = y;
        y = z;
        z = temp;
    }
    printf("Small to big: %d %d %d", x, y, z);

    return 0;
}

打印:

Please input 3 numbers:
12 34 23
Small to big: 12 23 34

本文原文首发来自博客专栏C语言实战,由本人转发至https://www.helloworld.net/p/562F3xc47iVD,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/106360844查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java例题_11 求不重复数
1/11【程序11求不重复数字】2题目:有1、2、3、4这四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?3程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。4/567/分析
CuterCorley CuterCorley
3年前
C语言基础习题50例(八)36-40
习题36求100之内的素数。实现思路:使用函数实现,并循环遍历依次判断。代码如下:cinclude<stdio.hinclude<math.hintmain(){intisPrime(intn);inti,count0;for(i2;i<101;i){if(isPrime(i)){
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
3年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Github标星5300+,专门为程序员开发文档开源管理系统,我粉了
!(https://oscimg.oschina.net/oscnet/a11909a041dac65b1a36b2ae8b9bcc5c432.jpg)码农那点事儿关注我们,一起学习进步!(https://oscimg.oschina.net/oscnet/f4cce1b7389cb00baaab228e455da78d0
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反