题解 P1179 【数字统计】

· · 题解

今天又有机会写题解了!!!

这道题涉及古老又神秘的统计学

统计学:

统计学的英文statistics最早源于现代拉丁文Statisticum Collegium(国会)、意大利文Statista(国民或政治家)以及德文Statistik,最早是由Gottfried Achenwall于1749年使用,代表对国家的资料进行分析的学问,也就是“研究国家的科学”。十九世纪,统计学在广泛的数据以及资料中探究其意义,并且由John Sinclair引进到英语世界。

统计学是一门很古老的科学,一般认为其学理研究始于古希腊的亚里士多德时代,迄今已有两千三百多年的历史。它起源于研究社会经济问题,在两千多年的发展过程中,统计学至少经历了“城邦政情”、“政治算数”和“统计分析科学”三个发展阶段。所谓“数理统计”并非独立于统计学的新学科,确切地说,它是统计学在第三个发展阶段所形成的所有收集和分析数据的新方法的一个综合性名词。概率论是数理统计方法的理论基础,但是它不属于统计学的范畴,而是属于数学的范畴。

政治算术

与“城邦政情”阶段没有很明显的分界点,本质的差别也不大。 “政治算术”的特点是统计方法与数学计算和推理方法开始结合。分析社会经济问题的方式更加注重运用定量分析方法。

1690年英国威廉·配弟出版《政治算数》一书作为这个阶段的起始标志。 威廉·配第用数字、重量和尺度将社会经济现象数量化的方法是近代统计学的重要特征。因此,威廉·配第的《政治算术》被后来的学者评价为近代统计学的来源,威廉·配第本人也被评价为近代统计学之父。

配第在书中使用的数字有三类: 第一类是对社会经济现象进行统计调查和经验观察得到的数字。因为受历史条件的限制,书中通过严格的统计调查得到的数据少,根据经验得出的数字多; 第二类是运用某种数学方法推算出来的数字。其推算方法可分为三种:

(1)以已知数或已知量为基础,循著某种具体关系进行推算的方法;

(2)通过运用数字的理论性推理来进行推算的方法;

(3)以平均数为基础进行推算的方法”;

第三类是为了进行理论性推理而采用的例示性的数字。配第把这种运用数字和符号进行的推理称之为“代数的算法”。从配第使用数据的方法看,“政治算数”阶段的统计学已经比较明显地体现了“收集和分析数据的科学和艺术”特点,统计实证方法和理论分析方法浑然一体,这种方法即使是现代统计学也依然继承。

统计分析科学

在“政治算术”阶段出现的统计与数学的结合趋势逐渐发展形成了“统计分析科学”。

十九世纪末,欧洲大学开设的“国情纪要”或“政治算数”等课程名称逐渐消失,代之而起的是“统计分析科学”课程。当时的“统计分析科学”(Science of statistical analysis)课程的内容仍然是分析研究社会经济问题。 “统计分析科学”课程的出现是现代统计发展阶段的开端。1908年,“学生”氏(William Sleey Gosset的笔名Student)发表了关于t分布的论文。这是一篇在统计学发展史上划时代的文章,它创立了小样本代替大样本的方法,开创了统计学的新纪元。

现代统计学的代表人物首推比利时统计学家奎特莱(Adolphe Quelet),他将统计分析科学广泛应用于社会科学,自然科学和工程技术科学领域,因为他深信统计学是可以用于研究任何科学的一般研究方法.

现代统计学的理论基础概率论始于研究赌博的机遇问题,大约开始于1477年。数学家为了解释支配机遇的一般法则进行了长期的研究,逐渐形成了概率论理论框架。在概率论进一步发展的基础上,到十九世纪初,数学家们逐渐建立了观察误差理论,正态分布理论和最小平方法则。于是,现代统计方法便有了比较坚实的理论基础。

上面的威廉佩蒂就是我们的统计学之父!!!

话锋一转,转到本题

先来粘代码,然后在听我娓娓道来

#include<bits/stdc++.h>
using namespace std;
int check(int n)
{
    int os;
    int i=0;
    while(n>=10)
    {
        os=n%10;
        n/=10;
        if(os==2) i++;
    }
    if(n==2) i++;
    return i;
}
int main()
{
    int n,m;
    int i;
    int ans=0;
    cin>>n>>m;
    for(i=n;i<=m;i++)
    {
        ans+=check(i);  
    } 
    cout<<ans<<endl;
    return 0;
} 

像计算机一样,从main函数开始解读代码

for(i=n;i<=m;i++)
{
    ans+=check(i);  
} 

从头到尾循环,借助check函数判断每一个数字中2的数量,加到ans里面

int os;
int i=0;
while(n>=10)
{
    os=n%10;
    n/=10;
    if(os==2) i++;
}

os起到了很大的作用。记录使用%10分离的每一位,然后来看看是不是2

最后祝大家NOIP2019.RP++

杜绝作弊,请勿抄袭