前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝桥杯官网 试题 PREV-261 历届真题 循环小数【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法

蓝桥杯官网 试题 PREV-261 历届真题 循环小数【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法

作者头像
红目香薰
发布2022-11-30 16:47:46
3480
发布2022-11-30 16:47:46
举报
文章被收录于专栏:CSDNToQQCode

为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

C++

代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;
long gcdMax(long x, long y);

int main()
{
    long a, b;
    long L, _L; //L存放循环体
    long F = 0; //F存放非循环体部分
    long X = 0, Y = 0; //X为分子,Y为分母,最终输出结果
    long gcd = 1; //最大公约数

    cin >> a >> b;
    cin >> _L;
    F = _L/pow(10, b-a+1);
    X = _L - F;
    Y = pow(10, b) - pow(10, a-1);
    gcd = gcdMax(X, Y);
    X /= gcd;
    Y /= gcd;
    cout << X << " " << Y << endl;

    return 0;
}

/*辗转相除法求最大公约数*/
long gcdMax(long x, long y)
{
    long temp = 1;
    if(x > y) {
        temp = x;
        x = y;
        y = temp;
    }//x位较小值,y位较大值

    while((y%x) != 0){
        temp = y%x;
        y = x;
        x = temp;
    }
    return(x);
}

C

代码语言:javascript
复制
#include<stdio.h>
#include<math.h>

int gcd(int a,int b){
    return a%b?gcd(b,a%b):b;
}

int main(){
	int p,q;
	long long decimal,num,deno,factor;
	scanf("%d%d",&p,&q);
	scanf("%I64d",&decimal);
	num=decimal-(int)floor(decimal/pow(10,q-p+1));
	deno=pow(10,q)-pow(10,p-1);
	factor=gcd(num,deno);
	printf("%I64d %I64d",num/factor,deno/factor);
	return 0;
}

Java

代码语言:javascript
复制
import java.util.Scanner;
public class Main {
	public long gys(long b,long c)
	{
		long a;
		while(b!=0)
		{
			a=c%b;
			c=b;
			b=a;
		}
		return c;
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in=new Scanner(System.in);
		Main s=new Main();
		long a=in.nextInt();
		long b=in.nextInt();
		long c=in.nextInt();
		long d=b-a+1;
		long e=10,e1=1;
		for(int i=1;i<d;i++)
		{
			e=e*10;
		}
		for(int i=1;i<=a-1;i++)
		{
			e1=e1*10;
		}
		long x=c%e;
		long x1=c/e;
		long i=1;
		long g=e*i-i;
		while(g%x!=0)
		{
			i++;
			g=e*i-i;
		}
		g=g/x*e1;
		long g1=0,g2=x1,g3=e1;
		g3=s.gys(g2,g3);
		long i1=x1/g3;
		g1=e1/g3;
		g3=s.gys(g1,g);
		g3=(g*g1)/g3;
		i=i1*(g3/g1)+i*(g3/g);
		g3=s.gys(i,g);
		System.out.println(i/g3+" "+g/g3);
	}

}

Python

代码语言:javascript
复制
#欧几里得算法(辗转相除法) 求最大公约数
def gcd(a,b):
    if a < b:
        a,b = b,a
    elif a==b:
        return 1
    while b!=0:
         temp = a % b
         a = b
         b = temp
    return a
   
p,q  = map(int,input().split())
s = input()
fz = int(s[p-1:q])
fm = int("9"*(q-p+1))
fz_1 = fz/gcd(fz,fm)
fm_1 = fm/gcd(fz,fm)
if p==1:
    print("%.0f %.0f"%(fz_1,fm_1))
else:
    qx = int(s[:p-1])
    fz_1 = int(fz_1)
    fm_1 = int(fm_1)

    fz_2 = (fz_1+qx*fm_1)/gcd(fz_1+qx*fm_1,fm_1*10**(p-1))
    fm_2 = fm_1*10**(p-1)/gcd(fz_1+qx*fm_1,fm_1*10**(p-1))
    print("%.0f %.0f"%(fz_2,fm_2)) 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++
  • C
  • Java
  • Python
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档