蓝桥杯——趣味分数问题(2017.2.17)
来源:互联网 发布:宇宙人餐饮软件 编辑:程序博客网 时间:2024/05/01 03:56
一、最大公约数与最小公倍数(GCD,LCM)
输入两个正整数m,n,求它们的最大公约数与最小公倍数
法一:枚举法
源代码:
#include <stdio.h>void fun(int m,int n){int i;int gcd,lcm; //最大公约数与最小公倍数 for(i=(m>n?n:m);i>=1;i--){if(m%i==0 && n%i==0){gcd=i;break;}}lcm=m*n/gcd;printf("%d %d\n",gcd,lcm);}int main(){int m,n;while(scanf("%d %d",&m,&n)!=EOF)fun(m,n); }法二:辗转相除法
思想:(1)用较大的数m除以较小的数n,得到的余数存储到变量p中,即p=m%n;
(2)上一步中较小的除数n和得出的余数b构成新的一对数,并分别赋值给m和n,继续做上面的除法;
(3)若余数为0,其中较小的数(即除数)就是最大公约数,否则重复(1)(2)两步。
源代码:
#include <stdio.h>void fun(int m,int n){int p,q,t;int gcd,lcm;q=m*n;if(m<n){t=m;m=n;n=t;}while(n!=0) //接下来的循环中m为最大公约数,n为余数 {p=m%n;m=n;n=p;}gcd=m;lcm=q/gcd;printf("%d %d\n",gcd,lcm);}int main(){int m,n;while(scanf("%d %d",&m,&n)!=EOF)fun(m,n);}程序截图:
二、歌星大奖赛
某歌星大奖赛中,有10个评委为参赛选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。编写程序实现。
源代码:
#include <stdio.h>#include <string.h>#define maxn 11int main(){int i,a[maxn]={0};int sum,maxscore,minscore;double average;while(scanf("%d",&a[0])!=EOF){for(i=1;i<10;i++)scanf("%d",&a[i]);maxscore=minscore=a[0];sum=0;for(i=0;i<10;i++){sum+=a[i];if(a[i]>maxscore)maxscore=a[i];if(a[i]<minscore)minscore=a[i];}sum-=(maxscore+minscore);average=sum*1.0/8;printf("max=%d min=%d\n",maxscore,minscore);printf("score=%.2lf\n",average);memset(a,0,sizeof(a)); //初始化数组}return 0;}程序截图:
三、将真分数分解为埃及分数
输入一个真分数,将该分数分解为n个(n>=1)埃及分数和的形式。
分子是1的分数,叫单位分数。古代埃及人在进行分数运算时,只使用分子为1的分数。因此这种分数也叫做埃及分数。
例如:8/11=1/2+1/5+1/55+1/110。
【分析】真分数分解为埃及分数之和的思路:
(1)分数的分子与分母分别用a和b表示,变量c用来存储各个埃及分数的分母;
(2)如果分母能够整除分子,可直接约减成一个埃及分数,此时埃及分数的分母c=b/a,分子为1,即直接将变量a赋值为1;
(3)否则分数中一定包含一个分母为(b/a)+1的埃及分数(即可分解出一个分母为(b/a)+1的埃及分数,c=(b/a)+1);
(4)如果分子是1,表明已经是埃及分数,不用再分解,结束;
(5)如果分子是3且分母是偶数,则可直接分解成两个埃及分数1/(b/2)和1/b,结束;
(6)从分数中减去这个分母为(b/a)+1的埃及分数,回到步骤(2)重复上述过程。
源代码:
#include <stdio.h>int main(){long int a,b,c; //a-分数分子 b-分数分母 c-各个埃及分数的分母while(scanf("%ld/%ld",&a,&b)!=EOF){while(1){if(b%a!=0) //若分子不能整除分母,则分解出一个分母为b/a+1的埃及分数c=b/a+1;else //否则,输出化简后的真分数(埃及分数) {c=b/a;a=1;}if(a==1) //a为1标志阶数 {printf("1/%ld\n",c);break;}elseprintf("1/%ld+",c);a=a*c-b; //求出余数的分子 b=b*c; //求出余数的分母if(a==3 && b%2==0) //若余数分子为3,分母为偶数,输出最后两个埃及分数{printf("1/%ld+1/%ld\n",b/2,b);break;}}}return 0;}程序截图:
四、列出真分数序列
按递增顺序依次列出所有分母为n,分子小于n的最简真分数
源代码:
法一:枚举分数的分子
#include <stdio.h>int main(){int fz,fm,n;int i,flag;while(scanf("%d",&n)!=EOF){fm=n;for(fz=1;fz<fm;fz++){flag=1;for(i=2;i<=fm/2;i++){if(fm%i==0 && fz%i==0){flag=0;break;}}if(flag==1)printf("%d/%d\n",fz,fm);}} return 0;}法二:结合辗转相除法思想求解(可降低算法复杂度)
#include <stdio.h>int main(){int i,j,n;int num1,num2;while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++){num1=n;num2=i;while(num2!=0) //辗转相除法求最大公约数 {j=num1%num2;num1=num2;num2=j;}if(num1==1) //分子与分母的最大公约数为1时,该分数为最简真分数 printf("%d/%d\n",i,n);}} return 0;}程序截图:
五、多项式之和的计算
计算下列多项式的值:S=1+1/(1*2)+1/(1*2*3)+ … + 1/(1*2*3* … *50)
源代码:#include <stdio.h>int main(){int i,j,n;double t,sum;while(scanf("%d",&n)!=EOF){sum=0;for(i=1;i<=n;i++){t=1;for(j=1;j<=i;j++) //注意精度问题,可以将阶乘形式的分母进行转化,计算t*=(1.0/j);sum+=t;}printf("%lf\n",sum);}return 0;}程序截图:
- 蓝桥杯——趣味分数问题(2017.2.17)
- 蓝桥杯——趣味素数问题(2017.2.3)
- 蓝桥杯——趣味数组问题一(2017.2.5)
- 蓝桥杯——趣味数组问题二(2017.2.14)
- 蓝桥杯——趣味整数问题一(2017.1.30)
- 蓝桥杯——趣味整数问题二(2017.1.31)
- 蓝桥杯——趣味逻辑推理二(2017.2.17)
- 趣味分数
- 蓝桥杯——趣味数学问题举例一(2017.2.10)
- 蓝桥杯——趣味数学问题举例二(2017.2.11)
- 蓝桥杯——趣味数学问题举例三(2017.2.13)
- 趣味算法之趣味分数
- 蓝桥杯——趣味逻辑推理一(2017.2.16)
- java趣味算法(一)——约瑟夫问题
- 趣味C—猴子吃桃问题
- 蓝桥杯——趣味算式
- C#趣味程序----分数之和
- 趣味算式(蓝桥杯)
- 安装python与mysql连接的模块
- 万能头文件 #include<bits/stdc++.h>
- 安卓开发工具类-MD5加密
- Open函数的flag和fcntl详解
- 数据库SQL优化总结一
- 蓝桥杯——趣味分数问题(2017.2.17)
- 【DRP】——oracle数据库中sys,system,scott,hr用户的区别
- docker学习笔记(一)
- Android6.0权限适配
- mysql命令大全
- #include "" 和include<>的用法
- 机器学习整理的一些概念
- 安装pywin32 错误提示3.6找不到注册表信息
- CMSampleBufferRef转CIImage