您的位置:首页 > 其它

一天一到算法题——乘积分析

2014-08-05 10:41 211 查看
给你一个数组
A[1..n]
,请你在
O(n)
的时间里构造一个新的数组
B[1..n]
,使得
B[i]=A[1]*A[2]*...*A
/A[i]
。你不能使用除法运算。

如果直接暴力,时间为O(n^2),所以要优化
我们看到 B[i]=A[1]*......A[i-1]*A[i+1]*......A

分成两份:第一部分是A[1]*......A[i-1] 第二部分是A[i+1]*......A
所以,计算B[i+1]时,就是用B[i]的第一部分乘上A[i]得到B[i+1]的第一部分而第二部分,得到A[i+1]*......A
,要再得到A[i]*A[i+1]*......A
,只需乘上A[i],
另开数组C,DC[i]=A[1]*......A[i-1]=C[i-1]*A[i-1];D[i]=A[i+1]*......A
=D[i+1]*A[i+1];
这是自己写的,有错误请指出
#include<stdio.h>

int a[100],b[100],c[100],d[100];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i,j;
        c[0]=1;
        d[n+1]=1;
        a[0]=1;
        a[n+1]=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            c[i]=c[i-1]*a[i-1];
        }
        for(i=n;i>=0;i--)
            d[i]=d[i+1]*a[i+1];
        for(i=1;i<=n;i++)
        {
            b[i]=c[i]*d[i];
            printf("%d ", b[i]);
        }
        printf("\n");
    }
    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: