进园子很久了,一直在看大家写的博客,感觉收获很多,而自己一直惭愧才疏学浅,不敢造次。 不过老是索取而不付出总归是不道德。所以从今天起写些自己一直以来积攒的些许知识。如果能对大家有所帮助那是再好不过了。
数组a[N]={a0,a1,a2....,an-1} 要构造数组b[N] 其中 b[i]=a[0]*a[1]*.....*a[N-1]/a[i]。要求是从了迭代器之外不能使用任何栈、堆、或静态变量
想必很多人都知道这是哪家公司的笔试题吧。废话不说直接上代码。欢迎大家啪砖
View Code
#include <iostream> #include <algorithm> using namespace std; #define N 10 template<class T> void print(const T &tmp) { cout<<tmp<<"\t"; } int main() { int a[N]={1,2,3,4,5,6,7,8,9,10}; int b[N]={0}; b[0]=1; b[1]=a[0]; //让 b[0]~b[N/2-1]中的b[i]全部成为 a[0]*a[1]*....a[i-1] for (int i=2;i<N/2;i++) { b[i]=b[i-1]*a[i-1]; } //这里b[N/2]=a[N/2]*a[N/2+1]*...a[N-1]只是为了方便计算 b[N/2]=1; for (int j=N/2;j<N;j++) { b[N/2]*=a[j]; } //将b[N/2]~b[N-1]中的b[i]变成 a[N-i]*a[N-i-1]*...a[N-1] for (int m=N/2+1;m<N;m++) { b[m]=b[m-1]*a[N-m]; } //这样就求出了前半部分 for (int n=0;n<N/2;n++) { b[n]*=b[N-n-1]; } //后半部分由于b[N]前半部分已经固定不能再动了,所以采用下面的方式 //先让b[N/2]~b[N-1]满足它们的右边部分 //即 b[i]=a[i+1]*a[i+2]*....a[N-1]; 当然得从右向左进行 //然后b[N/2]=a[0]*a[1]*....a[N/2-1]; // b[i]=b[N/2]*b[i]; b[N/2]*=a[i]; 从左向右进行 b[N/2]=1; for (int jj=0;jj<=N/2;jj++) { b[N/2]*=a[jj]; } //构造b[N/2]~b[N-1]部分 b[N-1]=1; for (int mm=N-2;mm>N/2;mm--) { b[mm]=b[mm+1]*a[mm+1]; } //构造真正的b[N/2]~b[N-1]部分 for (int nn=N/2+1;nn<N;nn++) { b[nn]=b[N/2]*b[nn]; b[N/2]*=a[nn]; } b[N/2]=1; //由于b[N/2]一直再变,所以最好还得求真正的b[N/2] for (int p=0;p<N;p++) { if (p==N/2) continue; b[N/2]*=a[p]; } //打印 for_each(b,b+N,print<int>); system("pause"); return 0; }
后来又想了想。前后两部分也可以一样: 设置 b[N/2-1]=a[N/2]*a[N/2+1]*...*a[N-1] b[N/2]=a[0]*a[1]*...a[N/2-1]
然后按照求b[N]后半部分的方法,一起求出来,最后分别把 b[N/2-1]和b[N/2] 求出来