蓝桥杯——既约分数(c语言)

蓝桥杯——既约分数(c语言)蓝桥杯 既约分数 c 语言 既约分数时限 1s 空间 256m 如果一个分数的分子和分母的最大公约数是 1 这个分数

大家好,欢迎来到IT知识分享网。

目录

一、题目描述

二、思路分析

1、分析题意:

2、解题思路:

三、算法实现

四、算法改进


一、题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。

例如  1/7 , 3/4 , 1/8 都是既约分数。

请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1和 2020)?

运行限制

  • 最大运行时间:2s
  • 最大运行内存: 128M

二、思路分析

1、分析题意:

最大公约数是1;分子和分母都是1——2020之间的整数,包括(1,2020)。

明确:

1、最大公约数为1,这两个数的约数各自不一定只有1。

2、求最大公约数为1的两数,分子分母一定不相等(分子分母都为 1例外),两数相等,其本身就是公约数。

2、解题思路:

1、需要遍历吗? 分子开始,遍历分母,然后分母开始,遍历分子?

       确定分子,然后遍历分母,判断是否有最大公约数,如果有count+2;因为只要有一组分子分母符合,那么分子分母互调也符合,所以count+2。

2、如何判断两数之间只有最大公约数?

      分母都除以分子的全部约数,判断能不能整除,能则不是。

有个问题:

1、确定分子,遍历分母,每个分子,分母都从1开始遍历吗?

     想:这样与我们设置的结构会有重复。

解决办法:如果每次分母遍历从分子的下一个数开始,是否可以呢,并且不会重复?

     这样不会重复,同时解决了分子分母不能相等的问题,不过最后结果count需要再加1,因为分子分母都为1满足。

三、算法实现

#include<stdio.h> main() { int i=0,j=0; int count=0; for(i=1;i<2020;i++) { int app[2020]={0}; //在循环中定义一个数组存放分子每一次的约数 int m=0,k=0; for(int k=2;k<=2020;k++) //判断分子的约数 { if(i%k==0) { app[m]=k; m++; } } for(j=i+1;j<=2020;j++) //判断分母 { for(k=0;k<m;k++) { if(j%app[k]==0) break; } if(k==m) //k==m,说明分子的约数,分母都不能整除 count=count+2; //每一组加2,分子分母可以互调 } } printf("%d",count+1); // 注意;count+1,分子分母都为1的情况 }

四、算法改进

求最大公约数可以用辗转相除法,也是欧几里得算法,

算法中也就是用递归函数实现

每一次用两数中的大数,除以小的数,直到a%b=0时,返回的b即是之间的最大公约数。

蓝桥杯——既约分数(c语言)

 6%16=6   

继续执行   辗转 (16,6)

16%6=4  

继续执行   辗转(6,4)

6%4=2 

继续执行  辗转(4,2)

4%2=0       最大公约数b=2

算法实现:

int app(int a,int b) { if(a%b==0) return b; else return app(b,a%b); } 
#include<stdio.h> int app(int a,int b) { if(a%b==0) return b; else return app(b,a%b); } int main() { int i,j,sum=0; for(i=1;i<=2020;i++) { for(j=1;j<=2020;j++) { if(app(i,j)==1) //判断分子分母的最大公约数是否为1 { sum++; } } } printf("%d",sum); return 0; }

执行结果:

蓝桥杯——既约分数(c语言)

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143420.html

(0)
上一篇 2025-05-03 18:33
下一篇 2025-05-03 19:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信