ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习随笔——求任意两数乘积和

2022-04-09 18:04:18  阅读:180  来源: 互联网

标签:end 乘积 ll start a3 a2 a4 随笔 任意


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有