题目:给你一个数组A[1..n],请你在O(n)的时间里构造一个新的数组B[1..n],使得B[i]=A[1]*A[2]*...*A[n]/A[i]。你不能使用除法运算。
解法一:最简单的一种方法,时间复杂都就是O(n^2),直接模拟出B[1..n]。
#define YE
#include<stdio.h>
#include<string.h>
int A[10010];
int B[10010];
int main()
{
#ifdef YE
freopen("123","r",stdin);
#endif
int n;
printf("请出入数组的大小:");
scanf("%d",&n);
int i,j;
for(i=0;i<=n;i++)
{
B[i]=1;
}
for(i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j!=i)
{
B[i]*=A[j];
}
}
}
for(i=1;i<=n;i++)
{
printf("%d ",B[i]);
}
printf("\n");
return 0;
}
可以的B[i]=P[i]*Q[n-i](0<=i<n)。时间复杂都为O(n),空间复杂都O(n)。
#define YE
#include<stdio.h>
#include<string.h>
int A[10001];
int B[10001];
int P[10010];
int Q[10010];
int main()
{
#ifdef YE
freopen("123","r",stdin);
#endif
int n;
printf("输入数组的大小:");
scanf("%d",&n);
int i;
for(i=0;i<=n;i++)
{
P[i]=Q[i]=1;
}
for(i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
for(i=1;i<n;i++)//从前扫描
{
P[i]=P[i-1]*A[i];
}
for(i=n;i>1;i--)//从后扫面
{
Q[n-i+1]=Q[n-i]*A[i];
}
for(i=0;i<n;i++)//前后两部分相乘
{
B[i+1]=P[i]*Q[n-1-i];
}
for(i=1;i<=n;i++)
{
printf("%d ",B[i]);
}
printf("\n");
return 0;
}
#define YE
#include<stdio.h>
#include<string.h>
int A[10010];
int B[10010];
int main()
{
#ifdef YE
freopen("123","r",stdin);
#endif
int n;
printf("请输入数组的大小:");
scanf("%d",&n);
int i;
for(i=0;i<=n;i++)
{
B[i]=1;
}
for(i=1;i<=n;i++)
{
scanf("%d",&A[i]);
}
for(i=1;i<n;i++)
{
B[i]=A[i]*B[i-1];
}
int C=A[n];
B[n]=B[n-1];
for(i=n-1;i>=1;i--)
{
B[i]=B[i-1]*C;
C*=A[i];
}
for(i=1;i<=n;i++)
{
printf("%d ",B[i]);
}
printf("\n");
return 0;
}
以上如有错误,请提出大家交流。