c语言基础程序——经典100道实例。

001, 组无重复数字的数

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

问题分析: 先在百位数选择一个数字,接着在十位上选择一个数字,最后在个位上选择一个数字,但要保证每次选择的三个数字都互不相同,使用三个for循环即可找出这样的数字。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include<stdio.h> // 标准的输入输出头文件

int main() {
   
    for (int i = 1; i < 5; i++) {
    // 先选择百位上的数字
        for (int j = 1; j < 5; j++) {
   // 接着选择十位上的数字
            for (int k = 1; k < 5; k++) {
    // 最后选择个位上的数字
                // 选择的三个数字必须都互不相同
                if (i != j && i != k && j != k) {
   
                    printf("%d%d%d\n", i, j, k);
                }
            }
        }
    }
    return 0;
}

优化:上面代码中也可以在for循环的时候判断是否有重复的数字,如果有,则直接跳过。

运行结果:

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

002,企业发放的奖金根据利润提成

  • 利润 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 ,求应发放奖金总数?

问题分析: 根据利润的区间,让数字在不同的区间分别单独计算。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include<stdio.h>

int main() {
   
    double i;// 利润
    double bonus = 0;// 奖金
    printf("当月利润是:");
    scanf("%lf", &i);// 输入当月利润
    double bonus1 = 100000 * 0.1;// 十万的奖金
    double bonus2 = bonus1 + 100000 * 0.075;// 二十万的奖金
    double bonus4 = bonus2 + 200000 * 0.05;// 四十万的奖金
    double bonus6 = bonus4 + 200000 * 0.03;// 六十万的奖金
    double bonus10 = bonus6 + 400000 * 0.015;// 一百万的奖金
    if (i <= 100000) {
   
        // 利润 i 低于或等于10万元时,奖金可提10%;
        bonus = i * 0.1;
    } else if (i <= 200000) {
   
        // 低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
        bonus = bonus1 + (i - 100000) * 0.075;
    } else if (i <= 400000) {
   
        // 20万到40万之间时,高于20万元的部分,可提成5%;
        bonus = bonus2 + (i - 200000) * 0.05;
    } else if (i <= 600000) {
   
        // 40万到60万之间时高于40万元的部分,可提成3%;
        bonus = bonus4 + (i - 400000) * 0.03;
    } else if (i <= 1000000) {
   
        // 60万到100万之间时,高于60万元的部分,可提成1.5%;
        bonus = bonus6 + (i - 600000) * 0.015;
    } else if (i > 1000000) {
   
        // 高于100万元时,超过100万元的部分按1%提成。
        bonus = bonus10 + (i - 1000000) * 0.01;
    }
    printf("应发奖金为:bonus=%lf", bonus);
    return 0;
}

运行结果:

当月利润是:350000
应发奖金为:bonus=25000.000000

003,完全平方数

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

问题分析:

假设该数为 x。

1、则 x + 100 = m,x + 100 + 168 = n,其中 m 和 n 都是完全平方数。

2、设 n = a2,m = b2,则 n - m = (a + b)(a - b) = 168,因为a+b和a-b具有相同的奇偶性,又因为168是偶数,所以a+b和a-b都是偶数。

3、设 a+b=2*i,a-b=2*j;可得 i * j = 168/4=42。

4、接下来只需要枚举 i 从 1 到 42 即可,根据上面的公式我们也可以得出 a = i + j,b = i - j,进一步又可以得出 m ,n 以及 x 的值。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include <stdio.h>

int main() {
   
    // 枚举 i 从 1 到 42 。
    for (int i = 1; i <= 42; i++) {
   
        if (42 % i == 0) {
    // 要满足i*j=42
            int j = 42 / i; // 计算 j 的值。
            if (i > j) {
   
                // 根据 i 和 j 可以计算 a ,b 以及 x 的值。
                int a = i + j;
                int b = i - j;
                int x = b * b - 100;
                printf("%d + 100 = %d * %d\n", x, b, b);
                printf("%d + 268 = %d * %d\n", x, a, a);
            }
        }
    }
    return 0;
}

运行结果:

-99 + 100 = 1 * 1
-99 + 268 = 13 * 13
21 + 100 = 11 * 11
21 + 268 = 17 * 17
261 + 100 = 19 * 19
261 + 268 = 23 * 23
1581 + 100 = 41 * 41
1581 + 268 = 43 * 43

004,判断当天是这一年的第几天

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

问题分析: 先计算当月之前的总天数,然后再加上当月的天数。比如10月16号,先计算9月(包含9月)之前的总天数,然后加上10月的16天,最后在判断是否是闰年,如果是闰年并且输入的月份大于 2 ,要多加一天。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include <stdio.h>

int main() {
   
    // 每月的天数,其中2月先暂定为28天。
    const int daysInMonth[] = {
   31, 28, 31, 30, 31, 30, 
                               31, 31, 30, 31, 30, 31};

    int day, month, year, total;
    printf("请输入年月日,格式为:年,月,日(2024,10,16)\n");
    scanf("%d,%d,%d", &year, &month, &day);  // 格式为:2024,10,16
    total = 0; // 计算输入月份之前的总天数
    for (int i = 0; i < month - 1; i++)
        total += daysInMonth[i];

    total += day;// 加上当月的天数
    // 判断是否为闰年
    int leap = (year % 400 == 0) || 
			   (year % 4 == 0 && year % 100 != 0);
    // 如果是闰年且月份大于2, 总天数加一天
    if (leap && month > 2)
        total++;
    printf("这是这一年的第 %d 天。", total);
    return 0;
}

运行结果:

请输入年月日,格式为:年,月,日(2024,10,16)
2024,10,16
这是这一年的第 290 天。

005,三个数由小到大输出

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

问题分析: 先用 x 和 y ,z 比较,只要比它俩小就交换,这样就可以保证 x 是这三个数中最小的。然后用 y 和 z 比较,把最大值保存在 z 中,这样 x、y、z 就是从小到大的了。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include <stdio.h>

// 交换两个变量的值
void swap(int *a, int *b) {
   
    int tmp = *a;// 需要临时变量
    *a = *b;
    *b = tmp;
}

int main() {
   
    int x, y, z;
    printf("请输入三个数字:\n");
    scanf("%d,%d,%d", &x, &y, &z);// 注意输入的时候用逗号隔开
    // 两两比较,前两个if可以保证 x 最小,最后一个if可以保证 z 最大。
    if (x > y)
        swap(&x, &y);
    if (x > z)
        swap(&x, &z);
    if (y > z)
        swap(&y, &z);
    printf("从小到大排序: %d %d %d\n", x, y, z);
    return 0;
}

运行结果:

请输入三个数字:
3,7,6
从小到大排序: 3 6 7

006,输出字母C图案

题目: 用 * 号输出字母C的图案。

问题分析: 按照字母C的形状直接输出即可。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include <stdio.h>

int main() {
   
    printf("用 * 号输出字母 C!\n");
    printf("****\n");
    printf("*\n");
    printf("* \n");
    printf("****\n");
    return 0;
}

运行结果:

用 * 号输出字母 C!
****
*
*
****

007,特殊图案

题目: 输出特殊图案。

问题分析: 不同字符,图形不一样。需要把编码格式改成437 OEM-美国,否则会出现乱码。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include<stdio.h>
#include <windows.h> // 引用头文件

int main() {
   
    SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
    char a = 177, b = 223;// 随便两个数字
    printf("%c%c%c%c%c\n", b, a, a, a, b);
    printf("%c%c%c%c%c\n", a, b, a, b, a);
    printf("%c%c%c%c%c\n", a, a, b, a, a);
    printf("%c%c%c%c%c\n", a, b, a, b, a);
    printf("%c%c%c%c%c\n", b, a, a, a, b);
    return 0;
}

运行结果:

在这里插入图片描述


008,9*9 乘法表

题目: 输出 9*9 口诀。

问题分析: 使用两个for循环即可完成。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include <stdio.h>

int main() {
   
    for (int i = 1; i < 10; i++) {
   // 行
        for (int j = 1; j <= i; j++) {
    // 列
            // %-3d表示左对齐,占3位
            printf("%d*%d=%-3d", j, i, i * j); 
        }
        printf("\n"); // 换行
    }
    return 0;
}

运行结果:

1*1=1
1*2=2  2*2=4
1*3=3  2*3=6  3*3=9
1*4=4  2*4=8  3*4=12 4*4=16
1*5=5  2*5=10 3*5=15 4*5=20 5*5=25
1*6=6  2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7  2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8  2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9  2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

009,国际象棋棋盘

题目: 要求输出国际象棋棋盘。

问题分析: 国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用 i 控制行, j 来控制列,根据 i+j 的和来控制输出黑方格,还是白方格。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include<stdio.h>
#include <windows.h> // 引用头文件

int main() {
   
    SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
    for (int i = 0; i < 8; i++) {
   
        for (int j = 0; j < 8; j++)
            if ((i + j) % 2 == 0)
                printf("%c%c", 219, 219);// 白色
            else
                printf("  ");// 黑色
        printf("\n");// 换行
    }
    return 0;
}

运行结果:

在这里插入图片描述


010,打印笑脸

题目: 打印楼梯,同时在楼梯上方打印两个笑脸。

问题分析: 用 ASCII 1 输出笑脸;用 i 和 j 来控制行和列,然后输出白色当做楼梯,要注意需要修改编码格式。

/**
 * Created by 公众号:数据结构和算法
 * Copyright © wansuanfa.com All rights reserved.
 */

#include<stdio.h>
#include <windows.h> // 引用头文件

int main() {
   
    SetConsoleOutputCP(437);// 设置编码为437 OEM-美国
    printf("\1\1\n"); // 打印两个笑脸
    for (int i = 1; i < 10; i++) {
   
        for (int j = 1; j <= i; j++)
            printf("%c%c", 219, 219);// 打印白色楼梯
        printf("\n");// 换行
    }
    return 0;
}

运行结果:

在这里插入图片描述


评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值