周赛补题 补充好好学写函数:求最大公因数和最小公倍数 复习(判断一个数是否是素数的方法)

int gcd(int  a,int b)						//求最大公因数
{
	if(b==0) return a;
	else return gcd(b,a%b);
}
int lcm(int a,int b)						//求最小公倍数
{
	return a*b/gcd(a,b);
}
//js
var gcd = function (a, b) {
    return b ? gcd(b, a % b) : a;
}
console.log(gcd(25,10))			//25和10的最大公因数5

六素数法判断一个数是否为素数

//java
public static boolean isPrime( int n ){
    if (n <= 3) {
        return n > 1;
    }
    if ( n % 2 == 0 || n % 3 == 0 ) {
        return false;
    }
    /* 可以看下面这一组数,就可以理解下面的解法了,从5开始,
     * 比如第一次直接开始判断n是否可以
     * 整除5 和 7, 加6之后判断是否可以整除11 和13 。如此类推
     * (5,11), (7,13), (11,17), (13,19)
     */
    int k = ( int )Math.sqrt( n ) + 1;
    for( int i = 5; i < k; i += 6 ){
        if( n % i == 0 || n % (i+2) == 0 ){
            return false;
        }
    }
    return true;
}
//C++
bool isPrime(int num)
{
	if (num == 2 || num == 3)
	{
		return true;
	}
	if (num % 6 != 1 && num % 6 != 5)
	{
		return false;
	}
	for (int i = 5; i*i <= num; i += 6)
	{
		if (num % i == 0 || num % (i+2) == 0)
		{
			return false;
		}
	}
	return true;
}

朴素暴力判断素数

bool isPrime_1(int n){
	for(int i=2;i<n;i++)
		if(n%i==0&&i<n)	return 0;	//注意2是质数 
	return 1;
} 

例题
7-1 N个数求和 (20分)
本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int n;
int gcd(int  a,int b)
{
	if(b==0) return a;
	else return gcd(b,a%b);
}
int lcm(int a,int b)
{
	return a*b/gcd(a,b);
}
int main()
{
	cin>>n;
	int a,b,ta,tb;
	for(int i=1;i<=n;i++)
	{
		scanf("%d/%d",&a,&b);
		if(i==1)
		{
			ta=a,tb=b;
		}
		else
		{
			int sb;
			sb=lcm(b,tb);//求出最小公倍数
			//两个分数合并 
			ta=sb/tb*ta+sb/b*a;
			tb=sb;
		}
		//分数化简 
		int g=gcd(abs(ta),abs(tb));
		ta=ta/g;
		tb=tb/g;
	}
	if(ta==0 ||  abs(ta)>=tb)
	{
		printf("%d",ta/tb);
		if(ta%tb==0)
		{
			printf("\n");
		}
		else
		{
			printf(" %d/%d\n",abs(ta)%tb,tb);
		}
	}
	else
	{
		printf("%d/%d\n",ta,tb);
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值