[算法设计与分析]3.3.1算术运算的妙用(开灯问题+间隔数)

本文探讨了两个有趣的编程问题:一是通过特定算法找出哪些灯泡最终处于打开状态;二是寻找数组中相邻两个元素乘积的最大值。文中通过C++实现了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<iostream>

using namespace std;
const int N = 10;

void LightOpen();
void InternalNum();

int main ()
{
    LightOpen();
    InternalNum();
}

void LightOpen()
{
    int a[N + 1] = {0};//进行初始化 同时代表编号为1的同学将全部灯关闭 0代表关闭
    int k;
    for(int i = 2; i <= N; i++)
    {
        k = 1;//起计数的作用
        while(i * k <= N)
        {
            a[i * k] = 1 - a[i * k];//技巧 使元素的值在0与1之间变换
            k++;
        }
    }
    for(int i = 1; i <= N; i++)
    {
        if(a[i])
            cout << i << "light is open" << endl;
    }
    cout <<endl;
}

void InternalNum()
{
    int p, q;
    int maxs, m, n;//m,n用于记录当前最大的间隔数字
    int k;
    int num[N] = {2, 5, 1, 8, 6, 5, 7, 3, 2, 1};
    maxs = 0;//进行初始化
    for(int i = 0; i < N; i++)
    {
        p = (N + i - 1) % N;//因为pq之间相隔一个数 因此p有下溢的危险 而q有上溢的危险
        q = (i + 1) % N;//针对两数的不同情况进行取模运算
        k = num[p] * num[q];
        if(maxs < k)
        {
            maxs = k;
            m = num[p];
            n = num[q];
        }
    }
    cout << "max:" << m << " * " << n << endl;
}

### FIR滤波器芯片前端设计方法实现 #### 3.1 FIR滤波器的基本原理 FIR(Finite Impulse Response,有限脉冲响应)滤波器是一种线性相位滤波器,具有稳定的特性。其工作原理基于输入信号的加权和延迟处理,即通过对输入序列的不同时间样本乘以不同的权重系 \( h[k] \),再将这些加权后的样本累加以得到输出[^1]。 #### 3.2 设计流程概述 在进行FIR滤波器芯片前端设计时,通常遵循以下几个方面: - **需求分析**:明确应用背景下的性能指标要求,比如通带范围、阻带衰减程度等。 - **算法选择**:依据具体应用场景选取合适的FIR滤波器结构形式,如串行、并行或混合架构;以及采用何种方式计算滤波器系\( h[k] \),例如窗口法、频率抽样法等[^2]。 #### 3.3 关键技术要点 ##### 3.3.1 滤波器系确定 对于给定的技术规格书中的参约束条件下,利用MATLAB或其他工具软件完成理想低通/高通原型函设计,并通过特定的方法转换成实际可用的一组离散化的时间域内冲击响应值作为最终使用的滤波器系\[h(k)\]。 ##### 3.3.2 结构优化 考虑到硬件资源利用率及时延等因素的影响,在满足精度的前提下尽可能简化电路逻辑复杂度。这可能涉及使用分布式算术运算(DA)或者快速傅立叶变换(FFT)加速卷积操作效率等问题。 ##### 3.3.3 测试验证 构建完整的测试平台来进行功能性和性能上的全面检验,确保所开发出来的IP核能够在目标平台上稳定可靠地运行。这部分工作往往伴随着大量的仿真实验据收集整理过程。 ```verilog // Verilog代码片段展示了一个简单的8阶FIR滤波器模块定义 module fir_filter ( input wire clk, input wire rst_n, // active low reset input wire signed [7:0] din, output reg signed [15:0] dout ); reg [7:0] delay_line [0:7]; always @(posedge clk or negedge rst_n) begin if (!rst_n) for (int i=0; i<8; ++i) delay_line[i] <= 8&#39;b0; else {delay_line[7:1], delay_line[0]} <= {din}; end wire signed [15:0] prod [0:7]; genvar j; generate for(j=0;j<=7;j=j+1)begin : mults assign prod[j]=delay_line[j]*coefficients[j]; // coefficients should be predefined constants end endgenerate integer k; always @(*) begin dout = 16&#39;d0; for(k=0;k<8;++k){ dout += prod[k]; } end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值