ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从“最简真分数的个数”谈起

2019-09-13 09:05:00  阅读:418  来源: 互联网

标签:真分数 个数 最简 67 整除 数有 2010


      所谓最简真分数是一个分数的分子小于分母,且分子分母无公因数。
      2010年湖北省小学奥林匹克数学竞赛(小学六年级组)有这样一道试题:以2010为分母的最简真分数有多少个?
      这道小学奥数试题考察的是学生对集合包含和容斥知识的掌握情况。
      由于2010=2*3*5*67(分解质因数),因此以2010为分母的最简真分数的分子必须小于2010且不能被2、3、5或67整除。
      小朋友解决这个问题的计算过程如下:
      在1~2010共2010个数中,
      能被2整除的数有 2010÷2=1005
      能被3整除的数有 2010÷3=670
      能被5整除的数有 2010÷5=402
      能被67整除的数有 2010÷67=30
      能同时被2和3整除的数有 2010÷(2×3)=335
      能同时被2和5整除的数有 2010÷(2×5)=201
      能同时被2和67整除的数有 2010÷(2×67)=15
      能同时被3和5整除的数有 2010÷(3×5)=134
      能同时被3和67整除的数有 2010÷(3×67)=10
      能同时被5和67整除的数有 2010÷(5×67)=6
      能同时被2、3和5整除的数有 2010÷(2×3×5)=67
      能同时被2、3和67整除的数有 2010÷(2×3×67)=5
      能同时被2、5和67整除的数有 2010÷(2×5×67)=3
      能同时被3、5和67整除的数有 2010÷(3×5×67)=2
      能同时被2、3、5和67整除的数有 2010÷(2×3×5×67)=1
      这样,1~2010中能被2或3或5或67整除的数有
        (1005+670+402+30)-(335+201+15+134+10+6)+(67+5+3+2)-1
       =2107-701+77-1   =1482
      因此,1~2010中既不能被2整除,也不能被3整除,也不能被5整除,也不能被67整除的数有 2010-1482=528 个。
      即以2010为分母的最简真分数有528个。

      我们可以看出,上面的计算过程是比较繁琐的,需要认真仔细。
      学习过程序设计后,可以编写了一个简单的循环程序解决这个问题。
      用一个变量cnt来保存最简真分数的个数,初始值为0。
      对1~2010中的每一个数num,进行判断,这是一个循环,写成
             for(num=1; num<=2010;num++)
      循环体中的判断方法为:如果num既不能被2整除,也不能被3整除,也不能被5整除,也不能被67整除,则计数。写成
       if(num%2!=0 && num%3!=0 && num%5!=0 && num %67!=0)
              cnt++;
      最后,输出结果cnt。   一个简单的程序,就得到问题的答案。
   编写的源程序如下:
       #include <stdio.h>
       int main()
       {
             int cnt,num;
             cnt=0;
             for (num=1; num<=2010;num++)
                  if (num%2!=0 && num%3!=0 && num%5!=0 && num %67!=0)
                       cnt++;
             printf("%d\n",cnt);
             return 0;
       }

      需要说明的是,当时竞赛的真题是:所有以2010为分母的最简真分数的和为多少?

      瞧瞧,作为大学生的你还能像小朋友一样做出来吗?

      当然,你学过程序设计,将上面的程序简单改写一下,可以很快得到答案的。何须像小朋友一样苦苦思考和运算呢。

#include <stdio.h>
int main()
{
     int num;
     double sum;
     sum=0;
     for (num=1; num<=2010;num++)
         if (num%2!=0 && num%3!=0 && num%5!=0 && num %67!=0)
               sum+=1.0*num/2010;
     printf("%lf\n",sum);
     return 0;
}

      程序运行后,输出 264.000000。即所有以2010为分母的最简真分数的和是264。

      小朋友是没法像程序一样硬算的。1/2010+7/2010+11/2010+…+2099/2010=264。

      小朋友有小朋友的聪明,1/2010是最简真分数,那么2099/2010 也一定是最简真分数。

      i/2010 是最简真分数,那么 (2010-i)/2010 也一定是最简真分数。

      1/2010 + 2099/2010=1         i/2010 +(2010-i)/2010=1。

      小朋友知道了以2010为分母的最简真分数有528个,因此它们的和为 528/2 = 264。

      因为2010分解质因数后,因数有2、3、5和67四个,用于考察集合的包含与容斥计算量略大但又可以完成,可以算是一道很好的竞赛试题。

     在这道试题的基础上,我们看这样一个问题。

【例1】最简真分数。

      任意输入一个正整数n,求以n为分母的最简真分数有多少个?

     (1)编程思路1。

      将输入的n作为分母,穷举分子i (1≤i≤n-1)。因此,程序可先写成如下的循环:

         for (i=1; i<=n-1; i++)
        {
               对每一分数i/n,进行是否存在公因数的检测。根据检测的结果决定是否计数;
        }
      在上面的循环体中需要对每一分数i/n,进行是否存在公因数的检测。如果分子i与分母n存在大于1的公因数k,说明i/n不是最简真分数,不予计数。怎样进行检测呢?
      因为公因数k的取值范围为[2,i],因而设置u循环在[2,i]中穷举k,若满足条件
            i%k==0 && n%k==0
      说明分子分母存在公因数k,标记t=1后退出。
      在对因子k进行循环穷举前,可设置标志t=0。退出因子穷举循环后,若t=1,说明分子和分母存在公因子;若保持原t=0,说明分子分母无公因数,统计个数。

      (2)源程序1。

#include <stdio.h>
int main()
{
      int n,i,k,t,cnt;
      while (scanf("%d",&n) && n!=0)
      {
           cnt=0;
           for (i=1;i<=n-1;i++)       // 穷举分子
           {
                t=0;
                for (k=2;k<=i;k++)  // 穷举因数
                    if (i%k==0 && n%k==0)
                    {
                         t=1;
                         break;          // 分子分母有公因数舍去
                    }
               if (t==0)
                     cnt++;           // 统计最简真分数个数
          }
          printf("%d\n",cnt);
      }
      return 0;
}

      将上面的源程序提交给 POJ 2407 “Relatives”,判定为Time Limit Exceeded。  POJ 2407的题意是: 输入正整数N,求小于或等于N ([1,N]),且与N互质的正整数(包括1)的个数。这与求最简真分数的意思完全一致。

      上面源程序1的方法简单直接,但对于N值较大的话,会超时的。因此,我们应找到快速的求法。在数论中,欧拉函数就很好地解决了这样的问题。

      在数论,对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,一般简记为φ函数。 例如,φ(8)=4,因为1,3,5,7均和8互质。

      一般来说,设正整数N分解质因数后,N=P1^q1*P2^q2*...*Pn^qn.

      则   φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn)。

      例如, 10= 2*5     φ(10)=10×(1-1/2)×(1-1/5)=4;     这4个数是1, 3, 7, 9 。

         30=2*3*5   φ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;  这8个数是1,7,11,13, 17, 19, 23, 29。

 

标签:真分数,个数,最简,67,整除,数有,2010
来源: https://www.cnblogs.com/cs-whut/p/11515994.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有