c++:队伍能力值

问题 B: 队伍能力值

题目描述

众所皆知ICPC和CCPC比赛是由3人一队参加的,每一个人有一个能力值,然后队伍能力值一定能被队内每一个人的能力值整除,我们已知一个队伍三个人的能力值a,b,c。并且队伍能力值在区间[L,R]内,请你判断该队伍的能力值有多少种可能?

输入

第一行输入三个整数a b c表示队伍中三个人的能力值。(1 <= a,b,c <= 1000) 第二行输入两个整数L
R表示队伍能力值的范围。(1 <= L <= R <= 1000000000)

输出

一个整数(队伍的能力值可能的情况数,结果可能为0)。

样例输入 Copy

2 4 8
7 16

样例输出 Copy

2

实现代码:

#include<iostream>
using namespace std;

int lcm(int x ,int y)  //求x,y的最小公倍数
{
	int r,m;
	m = x*y;
	while(y)
	{
		r = x % y;
		x = y;
		y = r;
	}
	return m/x;
}

int main(int argc, char const *argv[])
{
	int a,b,c;
	long l,r;
	cin >> a >> b >> c ;
	cin >> l >> r ;
    
    int _lcm = lcm(lcm(a,b),c);  //三个数的最小公倍数
   	int front = l / _lcm ;
   	int rear = r / _lcm;
   	num = rear - front ;
   	if(l%_lcm == 0)
   		num ++;
   	cout << num << endl;
	return 0;
}

暴力枚举:

#include<iostream>
using namespace std;

int main(int argc, char const *argv[])
{
	int a,b,c;
	cin >> a >> b >> c;

	int l , r;
	cin >> l >> r ;

	int num = 0;
	for (int i = l; i <= r; ++i)
	{
		if(i%a==0 && i%b==0 && i%c==0)
			num++;
	}
	cout << num << endl;
	return 0;
}

测试代码:

#include<iostream>
using namespace std;

int lcm(int x ,int y)
{
	int r,m;
	m = x*y;
	while(y)
	{
		r = x % y;
		x = y;
		y = r;
	}
	return m/x;
}
 
int func1(int a,int b,int c,int l,int r)  //正确
{
	int num = 0;
	for (int i = l; i <= r; ++i)
	{
		if(i%a==0 && i%b==0 && i%c==0)
			num++;
	}
	return num;
}

int func2(int a,int b,int c,int l,int r)
{
	int num ;

	int lcm3 = lcm(lcm(a,b),c);
   	
   	// int in = r - l;

   	// num = in / lcm3 ;
   	// if(r<lcm3 && in % lcm3 == 0)
   	// 	// cout << num << endl;
   	// 	return num;
   	// else
   	// 	// cout << num + 1 << endl;
   	// 	return num + 1;
   	int front = l / lcm3 ;
   	int rear = r / lcm3;
   	num = rear - front;
   	if(l%lcm3 == 0)
   		num ++;
   	return num ;

}



int main(int argc, char const *argv[])
{
	for (int i = 0; i < 50; ++i)
	{
		int a = rand()%100 + 1;
		// int b = rand()%1000 + 1;
		// int c = rand()%1000 + 1;
		int b = a;
		int c = a;
		long r = rand()%10000 + 1;
		long l = rand()%r + 1;
		int in = r - l;

		int ra = func1(a,b,c,l,r);
		int wa = func2(a,b,c,l,r);

		if(ra != wa)
		{
			cout << "a = " << a << ",b = " << b << ",c = " << c << endl ;
			cout << "l = " << l << ",r = " << r << endl;
			cout << "in = " << in << endl ;
			cout << "lcm = " << lcm(lcm(a,b),c) << endl;
			cout << "right_answer = " << ra << endl;
			cout << "wrong_answer = " << wa << endl;
			cout << endl;
		}
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值