蓝桥备赛|常用算法之模拟法
模拟法
模拟法是打比赛时的一种常用方法,使用各种算法大多都离不开模拟,而对于蓝桥杯只要结果的的填空题是一个非常好的解决方案,而且对于蓝桥杯数论部分需要找规律的题目来说,模拟法是一个非常有用的方法。
今天我们来根据蓝桥杯真题讲解模拟法:
2020年省赛:
题目描述:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。例如3/4,1/8,7/1都是既约分数请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?运行限制1. 最大运行时间:1s2.最大运行内存:128M
题目解析
int gcd(int a,int b){return a%b?GCD(b,a%b):b;}//或者int gcd(int a,int b){int temp;while(b){/*利用辗除法,直到b为0为止*/temp = b;b = a % b;a = temp;}return a;}
//Java解题方法,仅供参考public class Main {static int gcd(int a, int b){int temp;while(b>0){/*利用辗除法,直到b为0为止*/temp = b;b = a % b;a = temp;}return a;}public static void main(String[] args) {int ans=0;for(int a=1;a<=2020;a++){for( int b=1;b<=2020;b++){if(gcd(a,b)==1) ans++;}}System.out.println(ans);}}
//C++解题方法,仅供参考#include <iostream>using namespace std;int gcd(int a,int b){int temp;while(b){/*利用辗除法,直到b为0为止*/temp = b;b = a % b;a = temp;}return a;}int main(){int ans=0;for(int a=1;a<=2020;a++){for( int b=1;b<=2020;b++){if(gcd(a,b)==1) ans++;}}cout<<ans<<endl;}
#Python解题方法,仅供参考def gcd(a, b):tem = 0while (b > 0):temp = bb = a % ba = tempreturn aif __name__ == '__main__':ans=0for a in range(1, 2021):for b in range(1, 2021):if gcd(a,b)==1 :ans+=1print(ans)
第二道,2019年国赛
题目描述:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。学习了约数后,小明对于约数很好奇,他发现,给定一个正整数 t,总是可以找到含有 t 个约数的整数。小明对于含有 t 个约数的最小数非常感兴趣,并把它定义为 St。例如 S1=1,S2=2,S3=4,S4=6,⋅⋅⋅现在小明想知道,当 t=100 时,S100 是多少?运行限制:1. 最大运行时间:1s2. 最大运行内存:128M
题目分析
int cnt(int a){int ans = 0;for (int j = a; j > 0; j--) {if (a % j == 0){ans++;}return ans;}}
编辑:冯泽霖
审核:王顺晔
