• 【c语言编程题一】促销计算、反序数、进制转换、排版类问题、杨辉三角形、日期类问题


    目录

    促销计算

    反序数

    转进制

    10 进制转 x 进制代码(x<10

    10 进制转 x 进制(通用版

    x 进制转 10 进制(x 为 2 时)

    x 进制转 10 进制(通用版

    x 进制转 y进制

    排版类问题

    字符棱形

    解法一

    解法二 

    杨辉三角形

    日期类问题

    题目一

    题目二



    促销计算

    题目描述

    某百货公司为了促销,采用购物打折的优惠方法,每位顾客一次购物:在 1000 元以上者,按 9.5 折优惠;在 2000 以上者,按 9 折优惠;在 3000 以上者,按 8.5 折优惠;在 5000 以上者, 按 8 折优惠;编写程序,购物款数,计算并输出优惠价。

    输入样例 

    #: 850 1230 5000 3560

    输出样例

    #: discount=1,pay=850

    discount=0.95,pay=1168.5

    discount=0.8,pay=4000

    discount=0.85,pay=3026

    1. #include
    2. #include //万能头文件
    3. using namespace std;
    4. int main (){
    5. double a;
    6. scanf("%lf",&a);
    7. if (a < 1000) printf("discount = 1 , pay = %g\n" , a);
    8. if (a >= 1000 && a< 2000) printf("discount = 0.95,pay = %g\n" , a*0.95);
    9. if (a >= 2000 && a< 3000) printf("discount = 0.9,pay = %g\n" , a*0.9);
    10. if (a >= 3000 && a< 5000) printf("discount = 0.85,pay = %g\n" , a*0.85);
    11. if (a >= 5000 ) printf("discount = 0.8,pay = %g\n" , a*0.8);
    12. return 0;
    13. }

    反序数

    • 反序数:输入一个整数如 123,将其转换为反序之后的整数 321
    1. #include
    2. #include //万能头文件
    3. int main() {
    4. int n;
    5. scanf("%d", &n);
    6. int ans = 0;//将反序之后的答案存在这里
    7. //将 n 逐位分解
    8. while (n > 0) {
    9. ans *= 10;
    10. ans += (n % 10);//得到个位
    11. n /= 10;//再缩小一位
    12. }
    13. printf("%d\n", ans);
    14. return 0;
    15. }

    转进制

    • 数位的拆解与合并,拆解很明显就是两 步,先取模然后除取整,合并就是先乘后加 

    10 进制转 x 进制代码(x<10

    1. #include
    2. #include //万能头文件
    3. int main() {
    4. int n,x;//输入数n(十进制)和要转换的x进制
    5. int s[105] ;
    6. scanf("%d%d",&n,&x) ;
    7. //数组下标
    8. int cnt = 0;
    9. //将n逐位分解
    10. while(n < 10){
    11. //获取数n的个位
    12. int w = (n % x);
    13. s[cnt++] = w;
    14. //数n减少一位
    15. n /= x;
    16. }
    17. //反序输出
    18. for(int i = cnt - 1;i>= 0;i--){
    19. printf("%d",s[i]);
    20. }
    21. printf("\n");
    22. return 0;
    23. }

    10 进制转 x 进制(通用版

    1. #include
    2. #include //万能头文件
    3. int main() {
    4. int n,x;//输入数n(十进制)和要转换的x进制
    5. char s[105] ;//十进制以上有字符,用char
    6. scanf("%d%d",&n,&x) ;
    7. //数组下标
    8. int cnt = 0;
    9. //将n逐位分解
    10. while(n < 10){
    11. //获取数n的个位
    12. int w =(n % x) ;
    13. if(w<10) s[cnt++] = w + '0';//转换为字符+‘0’
    14. //如果大于10则从A字符开始
    15. else s[cnt++] = (w - 10) + 'A';//转换为小写则加‘a ’
    16. //数n减少一位
    17. n /= x;
    18. }
    19. //反序输出
    20. for(int i = cnt -1;i>=0;i++){
    21. printf("%c",s[i]);
    22. }
    23. printf("\n");
    24. return 0;
    25. }

    x 进制转 10 进制(x 为 2 时)

    1. #include
    2. #include
    3. int main() {
    4. char s[105];
    5. //输入二进制字符串
    6. scanf("%s",&s);
    7. int len = strlen(s);
    8. int ans = 0;
    9. for (int i = 0;i
    10. if(s[i]=='0'){
    11. ans = ans *2;
    12. }
    13. else{
    14. ans = ans * 2 +1;
    15. }
    16. }
    17. printf("%d\n",ans);
    18. return 0;
    19. }

    x 进制转 10 进制(通用版

    1. #include
    2. #include
    3. int main() {
    4. char s[105];
    5. int x;
    6. //输入x进制字符串和代表的进制x
    7. scanf("%s%d",&s,&x);
    8. int len = strlen(s);
    9. int ans = 0;
    10. for (int i = 0;i
    11. ans = ans * x;
    12. if(s[i]>='0' && s[i]<='9') ans += (s[i] - '0')
    13. else ans += (s[i] - 'A') + 10;
    14. }
    15. printf("%d\n",ans);
    16. return 0;
    17. }

    x 进制转 y进制

    1. #include
    2. #include
    3. int main() {
    4. char s[105];
    5. int x,y;
    6. //输入二进制字符串和代表的进制x 以及要转换的进制y
    7. scanf("%s%d%d",&s,&x,&y);
    8. int len = strlen(s);
    9. int ans = 0;
    10. for (int i = 0;i
    11. ans = ans * x;
    12. if(s[i]>='0' && s[i]<='9') ans += (s[i] - '0');
    13. else ans += (s[i] - 'A') + 10;}
    14. char out[105];
    15. int cnt = 0;
    16. while(ans>0){
    17. int w = ans % y;
    18. if (w<10) out[cnt++] = w +'0';
    19. else out[cnt++] = (w - 10) + 'A';
    20. ans /= y ;
    21. }
    22. for (int i = cnt - 1;i>=0;i--){
    23. printf("%c",out[i]);
    24. }
    25. printf("\n");
    26. return 0;
    27. }

    排版类问题

    字符棱形

    • 题目描述:

    输入一个整数 n 表示棱形的对角半长度,请你用*把这个棱形画出来。

    • 输入:

    3

    • 输出:

    *

    ***

    *****

    ***

    *

    • 解题分析:

    对于这类题目,可以将它进行分解。从中间切开,上面一个三角形,下面一个 三角形。问题就转化为了如何输出三角形,利用两个 for 循环控制来输出三角形 

    解法一

    1. #include
    2. #include
    3. int main() {
    4. //n
    5. int n;
    6. scanf("%d", &n);
    7. //上三角
    8. for (int i = 1; i <= n; i++) {
    9. //先打印空白
    10. for (int j = 1; j <= n - i; j++) {
    11. printf(" ");
    12. }
    13. //再打印*
    14. for (int j = n - i + 1; j < n + i; j++) {
    15. printf("*");
    16. }
    17. printf("\n");
    18. }
    19. //下三角 下三角只需要将上三角反过来输出就行
    20. for (int i = n - 1; i >= 1; i--) {
    21. //先打印空白
    22. for (int j = 1; j <= n - i; j++) {
    23. printf(" ");
    24. }
    25. //再打印*
    26. for (int j = n - i + 1; j < n + i; j++) {
    27. printf("*");
    28. }
    29. printf("\n");
    30. }
    31. return 0;
    32. }

    解法二 

    1. #include
    2. int main()
    3. {
    4. char c;
    5. scanf("%c", &c);
    6. printf(" %c\n", c);
    7. printf(" %c%c%c\n", c, c, c);
    8. printf("%c%c%c%c%c\n", c, c, c, c, c);
    9. printf(" %c%c%c\n", c, c, c);
    10. printf(" %c", c);
    11. return 0;
    12. }
    '
    运行

    杨辉三角形

    • 输入描述: 输入你想输出杨辉三角形的行数 n(n<=20);当输入 0 时程序结束.
    • 输出描述: 对于每一个输入的数,输出其要求的三角形.每两个输出数中间有一个空格.每输完一个三角形换行.
    • 输入样例: 5
    • 输出样例:

    • 只需要按照题意用二维数组去计算即可。
    • 对于任意 一个数 a[i][j],都有 a[i][j] = a[i-1][j] + a[i-1][j-1]
    •  C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功

    1. #include
    2. #include
    3. int main() {
    4. int a[21][12] = {0};
    5. int n;//行数
    6. while(scanf("%d",&n) != EOF){
    7. if(n==0) break;
    8. a[1][1] = 1;
    9. for (int i = 2;i<=n;i++){//从第二行开始迭代,第一行只有一个数1
    10. for (int j = 1;j < i;j++){#迭代列
    11. a[i][j] = a[i-1][j] + a[i-1][j-1];//计算每个元素
    12. }
    13. }
    14. //遍历行列进行打印
    15. for(int i = 1;i<=n;i++){
    16. for (int j = 1;j < i;j++){
    17. printf("%d",a[i][j]);
    18. }
    19. printf("\n");
    20. }
    21. return 0;
    22. }
    23. }

    日期类问题

    题目一

    题目描述:

    定义一个结构体变量(包括年、月、日),编程序,要求输入年月日,计算并输出该日在本年中第几天。

    输入描述:

    输入三个整数(并且三个整数是合理的,既比如当输入月份的时候应该在 1 至 12 之间,不应该超过这个范围),否则输出 Input error!

    输出描述:

    输出一个整数.既输入的日期是本月的第几天。

    输入样例:

    1985 1 20

    2006 3 12

    输出样例:

    20

    71

    1. #include<stdio.h>
    2. #include<string.h>
    3. struct node{
    4. int year,month,day ;
    5. }p;
    6. int f[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    7. int main()
    8. {
    9. while(scanf("%d%d%d",&p.year,&p.month,&p.day) != EOF)
    10. {
    11. if((p.year%4==0) ||(p.year%400==0)&&(p.year%100!=0))
    12. {
    13. f[2] = 29;
    14. }
    15. else f[2] = 28 ;
    16. int flag = 0;
    17. //判断月份
    18. if (p.month<1 || p.month>12) flag = 1;
    19. //判断天数是否合法
    20. for(int i = 1;i<12;i++)
    21. {
    22. if(p.day < 0 || p.day > f[i])
    23. {
    24. flag = 1;
    25. }
    26. }
    27. if (flag)
    28. {
    29. printf("Input error!\n");
    30. continue;
    31. }
    32. int ans = p.day;
    33. for (int i = 1; i < p.month; i++)
    34. {
    35. ans += f[i];
    36. }
    37. printf("%d\n", ans);
    38. }
    39. return 0;
    40. }

    题目二 

    • 题目描述 

     今天是2012年4月12日星期四,编写程序,输入今天开始到12月31日之间的任意日期,输出那一天是星期几。例如输入“5(回车)20(回车)”(5月20日),输出应为“Sunday”。

    • 输入描述:
    输入第一行为月份。
    输入第二行为这个月的第几天。
    • 输出描述:
    输入这一天是星期几。
    
    • 输入样例#:
    5
    20
    • 输出样例#:
    Sunday
    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<stdio.h>
    4. #include<iostream>
    5. using namespace std;
    6. struct node{
    7. int year,month,day ;
    8. }p;
    9. int f[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    10. string s[7] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
    11. int main()
    12. {
    13. string end1;
    14. int ans = 0;
    15. cin>>p.month>>p.day;
    16. //如果是四月
    17. if(p.month==4)
    18. {
    19. ans = p.day - 12;
    20. }
    21. //如果是四月以后
    22. else if(p.month >=5 || p.month <=13)
    23. {
    24. for(int i = 5; i<p.month ;i++){
    25. ans += f[i];
    26. }
    27. ans = p.day + 15 + ans;
    28. }
    29. int res = (ans +3)%7;
    30. cout<<s[res]<<end1;
    31. return 0;
    32. }

  • 相关阅读:
    iCopy for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)
    python教程:11种字典常见操作
    前端面试问题(4)
    基于Stable Diffusion的AIGC服饰穿搭实践
    16. Docker容器监控CAdvisor+InfluxDB+Granfana
    salesforce是什么
    VDA到Excel方案介绍之自定义邮件接收主题
    【7】Docker中部署RabbitMQ
    gb28181 网守网关分离+推理服务架构
    【精选】构建智能木材计数系统:深度学习与OpenCV完美结合(详细教程+源码)
  • 原文地址:https://blog.csdn.net/m0_51933492/article/details/127089605