• 「C++」简单模拟


    这是一个公式:

    Fn=(1+52)n(152)n5

    根据大家的数学经验可以知道这是一个计算斐波那契数列的公式,那么假设我们不知道这是一个斐波纳契数列的公式,只知道他是一个简单的数学计算公式,该怎么求这个公式的值呢?答案就是需要使用模拟!而这篇博文,我们就来讨论一些简单的模拟题目,再教给大家一些做模拟题的方法。

    Q1:使用公式求斐波那契数列第n项值

    这是一个非常简单的模拟,可以直接使用C++头文件cmath中的库函数完成,这里我们可以看到题目中有两个比较难搞的东西,一个是:5而另一个就是mn(m(1+52)(152))

    根号可以使用sqrt函数,而m的n次方可以使用pow函数(或者位运算),注意,这两个函数的返回值都是double类型的,所以最好使用double类型存储,而且pow函数会有精度误差,所以一定要谨慎使用。

    接下来给大家看一下初步的代码:

    #include
    using namespace std;
    // 该函数用于计算斐波那契数列的第n项  
    double fibonacci(int n) {  
    	// 特判
        if(n <= 0) { 
            return 0;  
        }  
        // 模拟 
        double phi = (1 + sqrt(5)) / 2;
        double psi = (1 - sqrt(5)) / 2;
        double numerator = pow(phi, n) - pow(psi, n);  
        double denominator = sqrt(5); 
        return numerator / denominator;  
    }  
      
    int main() {  
        int n;  
        cin >> n; // 读入
        // 设置输出精度,以便更好地显示浮点数结果  
        cout << fixed << setprecision(2); // 这里我们输出两位小数  
        if (n >= 1) {  
            double res = fibonacci(n);  
            cout << "Fibonacci number at index " << n << " is: " << res << endl;  
        } else {  
            cout << "No answer" << endl;  
        }  
        return 0;  
    }
    

    输出一下,完全正确!

    这里我们定义了一个函数fibonacci,该函数用于求斐波那契数列的第n项,在函数里面,我们定义了四个变量:phipsinumeratordenominator

    phi求的是分数分子的左边部分(减号前的部分);
    psi求的是分数分子的右半部分(减号后的部分);
    numerator顾名思义是分子;
    denominator顾名思义就是分母。
    最后的返回值就是分数值(也就是分子除以分母)

    接下来我们来看一看下一个问题。

    Q2:[NOIP2003 普及组] 乒乓球

    题目背景

    国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 11 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 11 分制和 21 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

    题目描述

    华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 11 分制和 21 分制下,双方的比赛结果(截至记录末尾)。

    比如现在有这么一份记录,(其中 W 表示华华获得一分,L 表示华华对手获得一分):

    WWWWWWWWWWWWWWWWWWWWWWLW

    11 分制下,此时比赛的结果是华华第一局 110 获胜,第二局 110 获胜,正在进行第三局,当前比分 11。而在 21 分制下,此时比赛结果是华华第一局 210 获胜,正在进行第二局,比分 21。如果一局比赛刚开始,则此时比分为 00。直到分差大于或者等于 2,才一局结束。

    你的程序就是要对于一系列比赛信息的输入(WL 形式),输出正确的结果。

    输入格式

    每个输入文件包含若干行字符串,字符串有大写的 WLE 组成。其中 E 表示比赛信息结束,程序应该忽略 E 之后的所有内容。

    输出格式

    输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 11 分制下的结果,第二部分是 21 分制下的结果,两部分之间由一个空行分隔。

    样例 #1

    样例输入 #1

    WWWWWWWWWWWWWWWWWWWW
    WWLWE
    

    样例输出 #1

    11:0
    11:0
    1:1
    
    21:0
    2:1
    

    提示

    每行至多 25 个字母,最多有 2500 行。

    (注:事实上有一个测试点有 2501 行数据。)

    【题目来源】

    NOIP 2003 普及组第一题

    分析

    这是一道很经典的签到模拟题,我们可以直接根据题意模拟:

    #include
    using namespace std;
    int win[114514];
    int w, l;
    int main() {
    	char s;
    	for(int i = 1; cin >> s && s != 'E'; ++ i) {
    		if(s == 'W') win[i] = 1;
    		else win[i] = 2;
    	}
    	for(int i = 1; ; ++ i) {
    		if(win[i] == 1) ++ w;
    		if(win[i] == 2) ++ l;
    		if(win[i] == 0) {
    			cout << w << ":" << l << endl << endl;
    			break;
    		}
    		if(w - l >= 2 || l - w >= 2)
    			if(w >= 11 || l >= 11) {
    				cout << w << ":" << l << endl;
    				w = 0;
    				l = 0;
    			}
    	}
    	w = 0;
    	l = 0;
    	for(int i = 1; ; ++ i) {
    		if(win[i] == 1) ++ w;
    		if(win[i] == 2) ++ l;
    		if(win[i] == 0) {
    			cout << w << ":" << l;
    			break;
    		}
    		if(w - l >= 2 || l - w >= 2)
    			if(w >= 21 || l >= 21) {
    				cout << w << ":" << l << endl;
    				w = 0;
    				l = 0;
    			}
    	}
    	return 0;
    }
    

    首先一定要开数组存储胜负次数,因为你不仅要存胜负的场数,还要存胜负的顺序,以此来排分数。其次分数差要大于2,这是因为正规乒乓球比赛,不仅分数要大于11(或21),两者分数相差也要大于2。如果比赛分数达到11-10,比赛会继续。直到一个人比另外一个人多两分。(如13-11)21分制同理,这里不再过多阐述。

    其实这两道题目的模拟算是C++当中最简单的,接下来,我会再发表几篇文章用以阐述复杂的模拟算法。


    __EOF__

  • 本文作者: charzie-blog
  • 本文链接: https://www.cnblogs.com/charzie-blog/p/18248461
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    [矩阵的乘法运算] m*M = c
    js实现防抖函数,输入框持续输入打印最终的值
    SpringMVC的概念和使用以及bean加载控制
    springboot基于微信小程序的化妆品商城系统设计与实现毕业设计源码041152
    ubuntu16.04 使用rc.local 随机启动java程序
    Seata——基础(笔记)
    第一课数组、链表、栈、队列
    合作技术保密协议
    对于使用Cookie还是使用Session的判断 [JavaWeb][Servlet]
    通过containerd部署k8s集群环境及初始化时部分报错解决
  • 原文地址:https://www.cnblogs.com/charzie-blog/p/18248461