老颜算法实验课 化简(蛮力法部分)与gcd算法讲解与证明

化简

题目描述 在这里插入图片描述

分析

该题是访问Q次,并每次访问的数的分母一定小于输入数据n且输入的数需小于1大于0,并保证他是最分数,因此分数的分子与分母的·1最大公约数一定为1,因此我们对于每次访问,仅需循环1到qi,并对1到qi的数判断它与qi是否存在大于1的最大公约数。而求最大公约数可使用欧几里得算法(gcd算法)

gcd算法

首先我们设 a与b两数字,同时因为两数一定存在一个最大公约数,因此设a=k1×c,b=k2×c; 而此时a mod b 得出余数r等价于 r=a-p×b;
因此 r=k1×c-p×k2×c 因此 r=(k1-k2×p)c;故此时r为c的倍数所以我们仅需求出r%c取余为0时 就可得到c

因此我们仅需先求出r(a%b),r是c的倍数,b也是c的倍数,此时以b为a,r为b重复步骤,可以不断减小r的数值(注意此时r仍然是c的倍数),直到r等于c,并此时b也为c的倍数故b%r==0;此时返回r;


#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
return b ? gcd(b, a%b) : a;//如果b不为0则继续递归gcd如果为0则返回a;
}
int main()
{
 int N,Q;
 cin>>N>>Q;
 while(Q--)
 {
  int num=0,k;
  cin>>k;
  for(int i=1;i<k;i++)
   if(gcd(i,k)==1)num++;
  cout<<num<<endl;
 }
 return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值