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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值