【大风】水仙花数最简短,运行速度最快的代码

本文介绍了使用打表法实现的水仙花数计算,该方法简洁且运行速度快。通过遍历1到1000之间的整数,检查每个数的每一位数字立方和是否等于原数,以此找出所有水仙花数。
#include <stdio.h>

int arr[4]={153,370,371,407};

int fun (int x)
{
    for (int i=3;i>=0;i--)
    {
        if (arr[i]<=x) return arr[i];
    }
    return -1;
}
int main()
{
    int num;
    scanf("%d",&num);
    if (fun(num)<0) printf("Doesn't exist\n");
    else printf("%d\n",fun(num));
}
### 使用51单片机控制蜂鸣器的示例代码 #### 无源蜂鸣器控制 对于无源蜂鸣器,需要通过PWM(脉宽调制)来生成特定频率的方波信号以产生不同音调。下面是一段简单的C程序,展示了如何利用定时器中断实现这一功能: ```c #include <reg52.h> sbit BUZZER = P0^0; // 定义蜂鸣器连接到P0.0引脚 void Timer_Init(void); void Buzzer_Tone(unsigned int frequency); // 主函 void main() { TMOD = 0x01; // 设置T0为模式1 (16位计器) TH0 = 0xFF; TL0 = 0xF9; // 初始装载值, 预设一个较高的初值以便后续调整 TR0 = 1; // 启动定时器0 EA = 1; // 开启全局中断 while(1){ Buzzer_Tone(1000); // 发出1kHz的声音持续一段时间 DelayMs(500); // 延迟半秒 Buzzer_Tone(2000); // 改变为2kHz声音 DelayMs(500); } } // 初始化定时器配置 void Timer_Init(){ ET0 = 1; // 允许定时器溢出中断 } // 根据给定频率设置相应的占空比并开启或关闭蜂鸣器发声 void Buzzer_Tone(unsigned int freq){ unsigned long period = 12000 / freq ; // 计算周期长度 TH0 = -(period >> 8); // 将计算得到的时间重新加载至TH0寄存器中 TL0 = -(period & 0xff); // 和TL0寄存器中 BUZZER = ~BUZZER; // 反转当前状态使能/禁用输出高低电平切换形成方波 } ``` 此代码片段实现了两种不同的音频频率交替播放的效果[^4]。 #### 有源蜂鸣器控制 相比之下,操作有源蜂鸣器要更加简便一些,因为这类器件内置了振荡电路,在供电之后即可自动发出固定的提示声。因此只需要简单地改变I/O口的状态就能轻松触发其工作: ```c #include <reg52.h> #define BUZZER_PIN P2^5 // 设定使用的IO端口号 void delay(int ms){ // 简易延时子程序 int i,j; for(i=ms;i>0;i--) for(j=11;j>0;j--); } void main(){ while(1){ BUZZER_PIN = 0; // 输出低电平激活蜂鸣器 delay(500); // 持续时间设定为约0.5秒 BUZZER_PIN = 1; // 关闭蜂鸣器 delay(500); } } ``` 这段简易程序可以让有源蜂鸣器每隔一秒钟发出一次短暂的“嘀”声[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值