/*
一个长度为n的数组a[0],a[1],...,a[n-1]。现在更新数组的名个元素,即a[0]变为a[1]到a[n-1]的积
a[1]变为a[0]和a[2]到a[n-1]的积,...,a[n-1]为a[0]到a[n-2]的积。
程序要求:
要求具有线性复杂度。
不能使用除法运算符
*/
/*
Author: Unimen
Date: 01/10/2011 23:20
*/
/*
解题报告:
做三次乘法:假设数组里有5个数
1、计算a0, a0a1, a0a1a2, a0a1a2a3
2、计算a4, a3a4, a2a3a4, a1a2a3a4
3、挨个计算出相应的值:
a0 = a1a2a3a4
a1 = a0 * a2a3a4
a2 = a0a1 * a3a4
a3 = a0a1a2 * a4
a4 = a0a1a2a3
时间复杂度为:O(2*(n-1)+n) = O(3n-2)
*/
#include <iostream>
using namespace std;
const int maxn = 1000000;
int anInput[maxn];
int anResult1[maxn];
int anResult2[maxn];
int main()
{
int n;
int i;
while (cin>>n)
{
for (i=0; i<n; ++i)
cin>>anInput[i];
//第一次
int temp = 1;
for (i=0; i<n-1; ++i)
{
temp *= anInput[i];
anResult1[i] = temp;
}
//第二次
temp = 1;
for (i=0; i<n-1; ++i)
{
temp *= anInput[n-1-i];
anResult2[i] = temp;
}
//第三次
for (i=0; i<n; ++i)
{
if (0 == i)
anInput[i] = anResult2[n-2];
else if (n-1 == i)
anInput[i] = anResult1[n-2];
else
{
anInput[i] = anResult1[i] * anResult2[n-i-3];
}
}
for (i=0; i<n; ++i)
cout<<anInput[i]<<" ";
cout<<endl;
}
return 0;
}
搜狗的一道笔试题
最新推荐文章于 2018-01-26 17:42:13 发布