> 文章列表 > c++算法——枚举法

c++算法——枚举法

c++算法——枚举法

枚举概念

枚举法是通过计算机速度快的特点,对问题所有可能性进行枚举,从中找到答案,需要利用循环。

例题

1,简单数字谜

题目描述

在□内填上一个合适的相同的数字,使等式“□3×6528=3□×8256”成立。

输入格式

输出格式

一个数字

样例输入

(无)

样例输出

4

 用一个for循环就行了,提示:循环从1开始到9。

代码也很简单

#include <bits/stdc++.h>//万能头
using namespace std;int main(){for(int i=1;i<=9;i++){//朴实无华的for循环if((i*10+3)*6528==(30+i)*8256){cout<<i<<endl;return 0;//这个嘛,最好写上}}return 0;//养成好习惯
} 

百钱买百鸡

题目描述

中国数学家张邱建(公元五世纪,其它资料不详)在他的《算经》中提出了著名的“百钱买百鸡”问题:

鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。

百钱买百鸡,问翁、母、雏各几何?

你的任务:输出所有可行的方案。

输入格式

输出格式

输出共有若干行:

每行三个整数,相互之间用1个空格隔开,依次为公鸡、母鸡、小鸡的数量。

所有方案,第一优先级按公鸡的数量从小到大排列。

样例输入

(无)

样例输出

(无)

代码很简单

 #include <iostream>#include <cstdio>using namespace std;int main(){for(int i=0;i<=20;i++){for(int j=0;j<=33;j++){for(int k=0;k<=99;k+=3){if(i+j+k==100 && i*5+j*3+k/3==100){cout<<i<<" "<<j<<" "<<k<<endl;}}}}return 0;}

枚举约数的优化

约数的分布具有规律(成对出现),可以从O(n)的复杂度优化到O(\\sqrt{n}),提高了枚举的效率。

 需要注意的是,完全平方数有一对完全相同的约数

例题

统计约数

题目描述

给定一个正整数n,统计它有多少个约数。

输入格式

一个正整数n(1≤n≤2,000,000,000)。

输出格式

一个整数,为n的约数的个数。

样例输入

9

样例输出

3

  枚举两两组合

这种问题要判断是可以重复还是不可以重复

例题

2022数对

 题目描述

如果两个数之和为 2022,则称这两个数组成了一个“2022 数对”。

现在,给定 n 个互不相同的整数,统计其中有多少对整数之和为 2022。

输入格式

第一行一个整数 n (n<10000) 。

第二行 n 个整数 ai​ (−10000≤ai​≤10000) 。

输出格式

输出一个整数,为 2022 数对的数量,不能重复统计。

样例输入

5
1 2021 1000 1022 3

样例输出

2