Practice(1):构建乘积数组c++

本文介绍了一种不使用除法计算数组元素乘积的算法。通过两次遍历,先计算每个元素左侧所有元素的乘积,再计算右侧所有元素的乘积,最终得到每个元素对应的乘积结果。

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

 

class Solution {
public:
    /**************************
    A.size=5;
    B[0]=A[1]A[2]A[3]A[4]
    B[1]=A[0]A[2]A[3]A[4] 
    B[2]=A[0]A[1]A[3]A[4]
    B[3]=A[0]A[1]A[2]A[4]
    B[4]=A[0]A[1]A[2]A[3]
    ***************************/
    vector<int> multiply(const vector<int>& A) {
        vector<int> B;
        B.resize(A.size());
        int n = A.size();
        for (int i = 0; i < n;++i) {
            B[i] = 1;
            for (int j = 0; j <n; ++j) {
                if(i!=j)
                    B[i] *= A[j];
            }
        }
        return B;
    }
};
int main() {
    Solution res;
    vector<int> A,B;
    for (int i = 1; i < 5; ++i) {
        A.push_back(i);
    }
    B = res.multiply(A);
    for (int i = 0; i < B.size(); ++i) {
        cout << "B[" << i << "]=" << B[i] << std::endl;
    }
    cout << "done" << endl;    
}

网上较好思路:

链接:https://www.nowcoder.com/questionTerminal/94a4d381a68b47b7a8bed86f2975db46?answerType=1&f=discussion
来源:牛客网

public:
    vector<int> multiply(const vector<int>& A) {
        int len=A.size();
        vector<int> B(len);
        int res=1;
        for(int i=0;i<len;i++){
            B[i]=res;
            res*=A[i];
        }
        res=1;
        for(int i=len-1;i>=0;i--){
            B[i]*=res;
            res*=A[i];
        }
        return B;
    }
};
//B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
//从左到右算 B[i]=A[0]*A[1]*...*A[i-1]
//从右到左算B[i]*=A[i+1]*...*A[n-1]

 

c++14 # T533558 过河卒 ## 题目背景 > > 这可能是我出题生涯出过最好的题了 > 这可能是我出题生涯出过最烂的题了 ## 题目描述 一个几年前刚刚和两个红方帅对抗完的黑卒正在二维平面上闲逛。 这时,他看见了一个 $n$ 行 $n$ 列的棋盘。 这个棋盘的某些格子是可以通过的,有些是不能通过的。 这让他回忆起了在不知道多久之前躲避一匹马的追击的英勇故事。 于是,他从这个棋盘的左上角开始,尝试只能向右或向下走有多少种能够到达右下角的方案。 最后,他走出了 $L$ 种方案。 但是他忘记了棋盘的样子,只是依稀记得 $n\le 30$。 于是他找到了很久之前帮助他判断是他赢还是红方帅赢的你。 希望你能够给出一组构造,使得从左上角到右下角的方案数为 $L$。 **保证 $L$ 在范围内均匀随机生成。** ## 输入格式 **本题多测。** 第一行,一个正整数 $T$,表示数据组数。 随后输入 $T$ 组数据。对于每组数据,输入一个非负整数 $L$。 ## 输出格式 对于每组数据,第一行输出一个正整数 $n$,表示棋盘的大小,如果无解,请输出 $-1$。 如果有解,接下来的 $n$ 行,每行 $n$ 个 $0$ 或者 $1$,分别表示这个格子不可以或可以通过。 **请保证左上角与右下角的格子可以通过。** ## 输入输出样例 #1 ### 输入 #1 ``` 2 2 20 ``` ### 输出 #1 ``` 3 1 1 1 1 0 1 1 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ``` ## 说明/提示 ### 评分标准 对于某一个测试点,若你的输出有无解均判断正确,则你至少可以获得 $20\%$ 的分数。 特别的,如果你的输出的格式不合法,你可能会获得 $0$ 分,一种格式合法的输出是全 $1$ 棋盘。 ### 数据范围 本题共包含 $20$ 个测试点,每个测试点 $5$ 分。 对于测试点 $1\sim 5$,满足 $L\le 5i$,其中 $i$ 表示测试点编号。 对于测试点 $6\sim 20$,满足 $L\le 10^{i-4}$,其中 $i$ 表示测试点编号。 对于所有数据,保证 $T=100$,$0\le L\le 10^{16}$,**$L$ 在范围内均匀随机生成**。 **你需要保证你给出的 $n$ 满足 $1\le n\le 30$。**
最新发布
01-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值