【C语言|知识回顾】水仙花数,打印菱形,喝汽水问题

194 阅读7分钟

theme: nico 8.28.2024 Wed

回顾

鸽鸽说过,回头看的力量是强大的,每次都会有不一样的收获。


看世界,也在寻找自己。 加油!

【经典】 自幂数

  • 一位自幂数 独身数
  • 三位自幂数 水仙花数
  • 四位自幂数 四叶玫瑰树
  • ...

水仙花数**(‌Narcissistic number**)也被称为超完全数字不变数(Pluperfect Digital Invariant, PPDI)、‌自恋数**、‌自幂数**或‌阿姆斯壮数**(Armstrong number),是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于这个数本身。 百度AI解释道

【daffodil】水仙花数

指的是 某三位数的各位数字的三次方之和仍等于该数。则称为水仙花数。 EG:153=1³+5³+3³.

【problem】问题:“输出所有的水仙花数”

【分析】
  • 前提条件:水仙花数的定义(某三位数的各位数字的三次方之和仍等于该数)
  • 根据定义划定数据范围(100-1000),即(100,1000)【开区间】;
  • 还需要得知各位的数字是多少,通过除法与求余数(模运算)求出;
  • 各位数字还需要三次方:
    • 暴力计算: aaa
    • 使用库函数:pow(x,y) ** 需要用到库函数,要引入对应的库函数名称<math.h> **
    • ...
  • 求得的结果相加求和。
  • 最后和该数num进行比对。若相等,则打印出。
【解题步骤】
  1. 写出基础逻辑框架.
#include <stdio.h>
#include <math.h>

// 声明函数
void daffodil();


int main(){
    
    // daffodil
    daffodil();
    return 0;
}

void daffodil(){

}
  1. 确定范围
#include <stdio.h>
#include <math.h>

// 声明函数
void daffodil();

int main(){
    
    // daffodil
    daffodil();
    return 0;
}
void daffodil(){
    
    for(int i = 100; i < 1000; i++ ){
    }
}
  1. 求出各位数字
#include <stdio.h>
#include <math.h>

// 声明函数
void daffodil();

int main(){
    
    // daffodil
    daffodil();
    return 0;
}
void daffodil(){
    
    // 各位数字
    int a,b,c,sum=0;
    
    for(int i = 100; i < 1000; i++ ){
        a = i / 100;
        b = i / 10 % 10;
        c = i % 10;
        // 并求和
        sum = pow(a,3) + pow(b,3) + pow(c,3);
        
    }
}
  1. 判断是否符合条件
#include <stdio.h>
#include <math.h>

// 声明函数
void daffodil();

int main(){
    
    // daffodil
    daffodil();
    return 0;
}
void daffodil(){
    
    // 各位数字
    int a,b,c,sum=0;
    
    for(int i = 100; i < 1000; i++ ){
        a = i / 100;
        b = i / 10 % 10;
        c = i % 10;
        // 并求和
        sum = pow(a,3) + pow(b,3) + pow(c,3);
        
        if( i == sum ) {
            printf("i=%d  \n",i);
        }
    }
}

完整思路

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

// 声明函数
void daffodil();

int main(){
    
    // daffodil
    daffodil();
    return 0;
}
void daffodil(){
    
    // 各位数字
    int a,b,c,sum=0;
    printf("daffodil numbers are ");
    for(int i = 100; i < 1000; i++ ){
        a = i / 100;
        b = i / 10 % 10;
        c = i % 10;
        // 并求和
        sum = pow(a,3) + pow(b,3) + pow(c,3);
        
        if( i == sum ) {
            printf("i=%d ",i);
        }
    }
    printf("\n");
}

改进(微动) 不太必要

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

// 声明函数
void daffodil();

int main(){
    
    // daffodil
    daffodil();
    return 0;
}
void daffodil(){
    
    // 各位数字
    // int a,b,c,sum=0;
    int arr[3]={0},sum=0;
    
    for(int i = 100; i < 1000; i++ ){
        int j=0;
        arr[j] = i / 100;
        arr[j + 1] = i / 10 % 10;
        arr[j + 2] = i % 10;
        // 并求和
        sum = pow(arr[j],3) + pow(arr[j + 1],3) + pow(arr[j + 2],3);
        
        if( i == sum ) {
            printf("i=%d  \n",i);
        }
    }
}
结果

daffodil numbers are 153 370 371 407

【经典 | 找规律 | 图案】打印菱形

打印如下图所示的菱形

image.png

【analysis】分析

思路: 仔细观察图形,可以发现,此图形中是由空格和*按照不同个数的输出组成的。

上三角:先输出空格,后输出 * ,每行中 空格:从上往下,一行减少1个; (*)看出规律,得出公式 2 * i + 1

下三角: 先输出空格,后输出*,每行中 空格:从上往下,每行多1个空格   * : 从上往下,按照2*(line-1-i)-1的方式减少,其中:line表示总共有多少行 按照上述方式,将上三角和下三角中的空格和*分别输出即可。 

image.png

思路

#include <stdio.h>

int main() {
    return 0;
}

void diamondPatter(){

    int n = 7;
    // 上三角
    for(int i = 0; i < n; i++ ){
        for(int j=0;j<n-i-1;j++){
            printf(" ");
        }
        for(int k=0;k<2*i+1;k++){
            printf("*");
        }
    }
    
    // 下三角
     for(int i = 0; i < n-2; i++ ){
        for(int j=0;j<n-i-1;j++){
            printf(" ");
        }
        for(int k=0;k<2*i+1;k++){
            printf("*");
        }
    }


}

【经典 | 找规律】喝汽水问题

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

【analysis】分析

  1. 1瓶汽水1元
  2. 2个空瓶可以换一瓶汽水

以下思路是基于有多少钱只能全部购买汽水,之后再根据空瓶数推算

    • 钱数 money
    • 汽水总数 total
    • 空瓶数 empty
  1. 1瓶汽水1元,有多少钱就能买多少汽水
    • total = money
  2. 有多少瓶汽水,就有多少个空瓶
    • empty = total

以上是初始值

  1. 两个空瓶可换一瓶汽水--- total empty
    • total += empty/2
    • empty = empty/2 + empty%2
  2. 此时是要判断空瓶数量empty是否大于1?
    • 若empty > 1,则需要执行第六步
    • 反之则得出最终的total

image.png

【代码】实现


#include <stdio.h>

// 声明
int sodaWater(int money);

int main() {
    int money = 0;
    printf("please input/enter the amount of money: ");
    scanf("%d",&money);
    int total = int sodaWater(int money);
    printf("the number of the soda water is %d \n",total);
    return 0;
}

int sodaWater(int money){

    int total = money,empty=money;
    
    while(empty>1){
        total += empty/2;
        empty = empty/2 + empty%2;
    }
    return total;
}

image.png

【分析 | 方法/思路Ⅱ】找规律

经过分析,我们知道三块钱可以买到 五瓶汽水。 如下图所示:

image.png

进而我们推出四块五块..

五块钱 --- 9瓶

...

当钱为10元时,可以喝19瓶汽水

image.png

总结以上规律,得出 total = 2*money-1

【代码】实现


#include <stdio.h>

// 声明
int sodaWater(int money);

int main() {
    int money = 0;
    printf("please input/enter the amount of money: ");
    scanf("%d",&money);
    int total = int sodaWater(int money);
    printf("the number of the soda water is %d \n",total);
    return 0;
}

int sodaWater(int money){
     if(money=0){
        return 0;
    }
    
    //int total = 2*money-1;
    
    return 2*money-1;
}