学C的第二十四天【练习:1. 打印菱形;2. 打印自幂数;3. 求Sn=a+aa..n项之和;4. 喝汽水问题;5. 调整数组使奇数位于偶数前面;6. 打印X形图案;7……;8……;9……;10……】-1

简介: 练习:(重点在图片注释) 1. 打印菱形

练习:(重点在图片注释)

                     

1. 打印菱形

题目:

用C语言在屏幕上输出以下图案:

765b3af719d74aca83f29df7118424e0.png

实现代码:

//打印菱形
//上半部分:空格在减少,*号在增多
#include <stdio.h>
int main()
{
  int line = 0;//上半行数
  scanf("%d", &line);//输入上半行数
  //菱形上半部分的打印:行数 -- line
  int i = 0;
  for (i = 0; i < line; i++)
  {
    //打印一行,先打印空格,再打印*号
    //打印空格:
    int j = 0;
    //上半部分空格规律:
    //      line-1-i:假设行数是7,
    //第一行打印7-1-0=6个空格;第二行打印7-1-1=5个空格……
    for (j = 0; j < line-1-i; j++)  
    {
      printf(" ");
    }
    //打印*号:
    //上半部分*号规律:
    //      2*i+1:假设行数是7,
    //第一行打印2*0+1个*号;第二行打印2*1+1个*号……
    for (j = 0; j < 2*i+1; j++)
    {
      printf("*");
    }
    //打印完后进行换行:
    printf("\n");
  }
  //菱形下半部分的打印:行数 -- line-1
  for (i = 0; i < line-1; i++)
  {
    //打印一行,先打印空格,再打印*号
    //打印空格:
    int j = 0;
    //下半部分空格规律:
    //      j<=i:假设行数是7-1=6,
    //第一行打印j=0,i=0,j<=i,1个空格;第二行打印j=0,i=1,j<=i,2个空格……
    for (j = 0; j <= i; j++)
    {
      printf(" ");
    }
    //打印*号:
    //下半部分*号规律:
    //    2*(line-1-i)-1:假设行数是7-1=6,
    //第一行打印2*(7-1-0)-1,11个*号;第二行打印2*(7-1-1)-1,9个*号……
    for (j = 0; j < 2*(line-1-i)-1; j++)
    {
      printf("*");
    }
    //打印完后进行换行:
    printf("\n");
  }
  return 0;
}

测试图片:

         

菱形上半部分:

image.png

菱形下半部分:

image.png

2. 打印0-100000中的自幂数(水仙花数是其中一种)

题目:

求出0~100000之间的所有自幂数输出

自幂数是指一个n位数,其各位数字的n次方之和恰好等于该数本身

如:153=1^3+5^3+3^3,则153是一个自幂数

实现代码:

//打印自幂数(0-100000):
//假设 m 是一个 n位数 ,m 的 每一位的n次方之和 等于 m。
//如-- 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3
#include <stdio.h>
#include <math.h>
int main()
{
  int i = 0;
  for (i = 0; i <= 100000; i++)
  //使用for循环产生0-100000的数
  {
    //判断i是否是自幂数:
    //1. 知道是几位数:计算i的位数 -- n
    //一个数 至少也是 一位数,所以起始 n=1
    int n = 1;
    int tmp = i;//代替i,防止后续操作改变循环变量
    //思路:i/10 --> 可以去掉一位 --> n+1 ,直到i/10==0
    while (tmp /= 10) //直到/10==0,停止循环
    {
      n++;//统计位数
    }
    //2. 求每一位的n次方之和
    //思路:%10 --> 取出每一位
    tmp = i;//再次替换i
    int sum = 0;//存放每位次方后的和
    while (tmp)//只要i不等于0,就继续取出每一位
    {
      sum += pow(tmp % 10, n);
      //模10 取出一位后,求出这位数的n次方,再求和
      tmp /= 10;//移至下一位
    }
    //3. 判断是不是自幂数
    if (sum == i)
    {
      printf("%d ", i);//是则进行打印
    }
  }
  return 0;
}

测试图片:

image.png

3. 求Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和

题目:

Sn=a+aa+aaa+aaaa+aaaaa+……的前n项之和,其中a一个数字

例如:2+22+222+2222+22222+……

实现代码:

//计算求和
//求Sn = a + aa + aaa + aaaa + aaaaa的前n项之和,其中a是一个数字,
//例如:2 + 22 + 222 + 2222 + 22222
#include <stdio.h>
int main()
{
  int a = 0;
  int n = 0;//a的前n项
  scanf("%d %d", &a, &n); 
  //规律:a + a*10+a + ……
  //利用规律算出每一项后相加
  int i = 0;
  int sum = 0;//算出每一项后相加
  int k = 0;//用于算出每一项
  for (i = 0; i < n; i++)//前n项,算n次
  {
    k = k * 10 + a;//利用规律算出每一项
    sum += k;//每一项相加
  }
  //输出结果:
  printf("%d\n", sum);
  return 0;
}

测试图片:


image.png

4. 喝汽水问题

题目:

喝汽水,1瓶汽水1元2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水(编程实现)

           

第一种方法 -- 实现代码:

//喝汽水问题
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
#include <stdio.h>
int main()
{
  int money = 0; //空瓶数
  int total = 0; //喝的全部瓶数
  int empty = 0; //空瓶数
  //输入钱数:
  scanf("%d", &money);
  total += money;//一开始,有多少钱就有多少瓶
  empty += money;//钱换了多少瓶就有多少空瓶
  //进行空瓶兑换:
  while (empty >= 2)//空瓶大于等于2瓶就进行兑换
  {
    total += empty / 2;//把兑换后的瓶数加到总瓶数中
    empty = empty / 2 + empty % 2;
    //empty / 2:换了多少瓶就又有多少个空瓶,
    //empty % 2:再加上可能没到2瓶不够换的1瓶
    //这两部分加起来才是总空瓶数
    //之后再判断需不需要再循环
  }
  printf("%d", total);
  return 0;
}

第一种方法 -- 测试图片:

image.png

第二种方法 -- 实现代码:

//喝汽水问题
//喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
#include <stdio.h>
int main()
{
  int money = 0; //空瓶数
  int total = 0; //喝的全部瓶数
  int empty = 0; //空瓶数
  //输入钱数:
  scanf("%d", &money);
  total += money;//一开始,有多少钱就有多少瓶
  empty += money;//钱换了多少瓶就有多少空瓶
  //利用方法一中发现的规律:
  if (money > 0)
    //防止0元计算出负一瓶的情况
  {
    total = 2 * money - 1;
    //使用规律进行计算
  }
  printf("%d", total);
  return 0;
}

第二种方法 -- 测试图片:

8ec520a1cace4e3180ba53aa5d17a6e6.png

相关文章
|
6月前
|
C++
【PTA】​L1-002 打印沙漏 ​ (C++)
【PTA】​L1-002 打印沙漏 ​ (C++)
73 0
【PTA】​L1-002 打印沙漏 ​ (C++)
|
6月前
|
编译器
11.14作业(打印图案,乘法表右对齐,圆周率,哥德巴赫猜想)
11.14作业(打印图案,乘法表右对齐,圆周率,哥德巴赫猜想)
|
5月前
|
C语言
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
C语言-----打印用“*”组成的X形图案,输出一个数表示行数
|
6月前
输入三个整数,以这三个数为边长,判断是否构成三角形;若不能输出”error”,若构成三角形,计算它的面积,保留2位小数输出。
输入三个整数,以这三个数为边长,判断是否构成三角形;若不能输出”error”,若构成三角形,计算它的面积,保留2位小数输出。
55 0
|
算法 Java
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
92 0
|
11月前
|
C语言
第十四弹--打印1-100之间的素数
第十四弹--打印1-100之间的素数
学C的第二十四天【练习:1. 打印菱形;2. 打印自幂数;3. 求Sn=a+aa..n项之和;4. 喝汽水问题;5. 调整数组使奇数位于偶数前面;6. 打印X形图案;7……;8……;9……;10……】-2
5. 调整数组使奇数全部都位于偶数前面 题目: 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。
126 0
学C的第十三天【应用多文件的形式实现 三子棋 程序(重点);练习:1. 打印9*9乘法口诀表、2. 求10个整数中的最大值、3. 分数加减交叉计算、4. 数一下 1到 100 的整数中出现了多少个9】
9.数组的应用实例1:三子棋(综合以前学习的知识) 三子棋的实现:(重点都在注释中) 1. 游戏不退出,继续玩下一把(循环) 2. 应用多文件的形式写代码