// 给定一个数组a[i],求数组b[i]:
// b[i] = a[0]*a[1]*...*a[i-1]*a[i-2]*...*a[n-1]=a[0]*a[1]*...*a[n-1]/a[i]
// 但是不能用除法
#include <stdio.h>
// 有除法
void method1(double*a, double *b, int n)
{
int i;
double pro=1.0;
for(i=0;i<n;i++)
pro = pro*a[i];
for(i=0;i<n;i++)
b[i]=(double(pro)/a[i]);
}
//不用除法
void method2(double *a, double *b, int n)
{
int i;
//b[i]=1;
for(i=0; i<n; i++)
b[i]=1.0;
// b[0]=1;
// b[1]=a[0]
// b[2]=a[0]*a[1]
// b[i]=a[0]*a[1]*...a[i-1]
// b[n-1]=a[0]*a[1]*...*a[n-2]
for (i=1; i<n; i++)
b[i] = b[i-1] * a[i-1];
// a数组平移。
// a[n-1]移到a[n-2]
// a[i]移到a[i-1]
// a[1]移到a[0]
// 得到新的a,记为a1
for (i=0;i<n-1;i++)
a[i]=a[i+1];
a[n-1]=1;
// a1变为a2:
// a2[n-1]=1
// a2[n-2]=a1[n-1]*a1[n-2]=a[n-1]
// a2[n-3]=a1[n-1]*a1[n-2]*a1[n-3]=a[n-1]*a[n-2]
// a2[i]=a1[n-1]*...*a1[i]=a[n-1]*...*a[i+1]
// a2[0]=a[n-1]*...*a[1]
// a2[1]=a[n-1]*...*a[2]
for(i=n-2;i>=0; i--)
a[i] = a[i]*a[i+1];
// b变成b1
// b[0]=1 * a[1]*...*a[n-1]
// b[1]=a[0] * a[2]*...*a[n-1]
// b[n-1]=a[0]*a[1]*...*a[n-2]
for (i=0;i<n;i++)
b[i] = b[i]*a[i];
}
void print(double *p,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",int(p[i]));
printf("\n");
}
int main()
{
double a[10];
double b[10];
int i;
for(i=0; i<10; i++)
{
a[i]=1.0*(i+1);
}
printf("原始:\n");
print(a,10);
printf("使用除法:\n");
method1(a,b,10);
print(b,10);
printf("不使用除法:\n");
method2(a,b,10);
print(b,10);
getchar();
return 0;
}
2745

被折叠的 条评论
为什么被折叠?



