蓝桥杯2021省赛:货物摆放|枚举+分解因数

题目链接:

15.货物摆放 - 蓝桥云课 (lanqiao.cn)

说明:

题目提示,希望n=l*w*h,即长宽高都是n的因数,那么这就是一道分解因数的题。

因为是一道填空题,不用考虑超时。采用枚举的方式先把因数全部找出来,再三重循环将因数进行一个组合。

一个优化的小地方是,只有 ((n/factors[i])%factors[j]==0)时,才进行第三次循环,因为如果n/factors[i]无法整除factors[j],这个因数组合显然是不合法的,所以肯定不用继续了。

另外在第三个循环里面找到了第三个因数之后也不用再继续循环下去了,因为前两个数确定,第三个数肯定是唯一的。

代码:

#include<bits/stdc++.h>
#define int long long
const int N=1e3+10;
using namespace std;
int n=2021041820210418ll; 
int ans=0;
vector<int> factors; 

//找因数时需要枚举的数平方<=原数的原因就是, 当你找到一个因数时,只需要原数除以/找到的这个因数,你就找到另外一个因数了 ,注意要判断两个因数是否相等 
signed main() {
   
   cin.tie(0);
   cout.tie(0);
   int m=sqrt(n);
   for(int i=1;i<m;i++){
   	if(n%i==0){
   		factors.push_back(i);
   		int k=n/i;
   		if(k!=i){
   			factors.push_back(k);
		   }
	   }
   }
   
   int lens=factors.size();
// sort(factors.begin(),factors.end());
   
   for(int i=0;i<lens;i++){
   	for(int j=0;j<lens;j++){

//分解因数,只需要找出前两个因数,因为只要找到前两个因素,第三个数就自然找到了
   	        if((n/factors[i])%factors[j]==0){
          //不知道为什么注释掉的这一段比起再开一个循环更慢
   	      //  	 int k=n/factors[i]/factors[j];
   	      //  	 ans++;
   	       	 
   	       	
  	       	for(int k=0;k<lens;k++)
  	       	if(factors[i]*factors[j]*factors[k]==n){
  				ans++;
  				break;
			   }
   	       }
   	      
	   }
   }
   
   cout<<ans;
   
    return 0;
}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值