学习随笔——求任意两数乘积和
作者:互联网
1.暴力解法:两个for循环,不再赘述
2.二分法:①:a1,a2,a3,a4两两相乘可化简为(a1+a2)*(a3+a4)+a1*a2+a3*a4。②:a1,a2,a3,a4,a5,a6,a7,a8两两相乘可化简为(a1+a2+a3+a4)*(a5+a6+a7+a8)+(a1+a2)*(a3+a4)+(a5+a6)*(a7+a8)+a1*a2+a3*a4+a5*a6+a7*a8。易推知对一串数量为N的数组亦可利用此种二分策略。
代码如下:
1 #include <stdio.h> 2 #include <math.h> 3 #define ll long long 4 ll N; 5 ll ans=0; 6 int n[300000]; 7 ll Binary (ll start,ll end){ 8 ll med = (start+end)/2; 9 if (end-start+1>3){ 10 ll n1=Binary(start,med); 11 ll n2=Binary(med+1,end); 12 ans+=n1*n2; 13 return n1+n2; 14 } 15 //分为1、2、3三种状况分别处理,返回和值即可 16 if (end-start+1==3){ 17 ans+=n[start]*n[start+1]+n[start]*n[start+2]+n[start+1]*n[start+2]; 18 return n[start]+n[start+1]+n[start+2]; 19 } 20 if (end-start+1==2){ 21 ans+=n[start]*n[start+1]; 22 return n[start]+n[start+1]; 23 } 24 if (end-start+1==1){ 25 ans+=n[start]; 26 return n[start]; 27 } 28 } 29 int main(){ 30 scanf("%d",&N); 31 for (ll i=1;i<=N;i++){ 32 scanf("%d",&n[i]); 33 } 34 ll s1=Binary (1,N); 35 printf("%d",ans); 36 return 0; 37 }
输入格式:
4//数字个数 1 2 3 4//数组
输出:
35//两两相乘结果
标签:end,乘积,ll,start,a3,a2,a4,随笔,任意 来源: https://www.cnblogs.com/johnsonstar/p/16122865.html