学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

相关文章
|
1月前
|
C++
【PTA】​L1-002 打印沙漏 ​ (C++)
【PTA】​L1-002 打印沙漏 ​ (C++)
48 0
【PTA】​L1-002 打印沙漏 ​ (C++)
|
1月前
|
编译器
11.14作业(打印图案,乘法表右对齐,圆周率,哥德巴赫猜想)
11.14作业(打印图案,乘法表右对齐,圆周率,哥德巴赫猜想)
|
定位技术
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
150 0
|
1月前
打印楼梯
打印楼梯。
24 3
|
12天前
1027 打印沙漏
1027 打印沙漏
|
1月前
L1-002 打印沙漏
L1-002 打印沙漏
21 0
|
11月前
|
算法 Java
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
2015 蓝桥杯省赛部分题整理(九数组分数,牌型种数,串逐位和,循环节长度,打印菱形)
73 0
|
6月前
|
C语言
第十四弹--打印1-100之间的素数
第十四弹--打印1-100之间的素数
|
11月前
学C的第二十四天【练习:1. 打印菱形;2. 打印自幂数;3. 求Sn=a+aa..n项之和;4. 喝汽水问题;5. 调整数组使奇数位于偶数前面;6. 打印X形图案;7……;8……;9……;10……】-2
5. 调整数组使奇数全部都位于偶数前面 题目: 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。