华为机试——素勾股数

题目描述

* 题目:勾股数,是由三个正整数组成的数组;能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整数解。
*       如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数。
*       如果 (a, b, c) 互质,它们就称为素勾股数。
*       给定正整数N, 计算出小于或等于N的素勾股数个数。
* 输入描述:输一个正整数
* 输出描述:素勾股数
* 示例输入:10
* 示例输出:1

代码实现

/***************************************************************
* 题目:勾股数,是由三个正整数组成的数组;能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整数解。
*       如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数。
*       如果 (a, b, c) 互质,它们就称为素勾股数。
*       给定正整数N, 计算出小于或等于N的素勾股数个数。
* 输入描述:输一个正整数
* 输出描述:素勾股数
* 示例输入:10
* 示例输出:1
***************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include <math.h>

/* 判断两个数字是否互质,返回值是1时表明互质,其它值则不互质 */
int is_coprime(int src1,int src2)
{
	if(0 == src2)
		return src1;
	else
		return is_coprime(src2,src1%src2);
}

int main()
{
	int input=0;
	int i,j;
	int a,b,c;
	int countor=0;
	
	scanf("%d",&input);
	
	if(0 < input)
		m = sqrt(input);
	else
		return -1;
	
	for(i=1;i<=input;i++)
	{
		for(j=i+1;j<=input;j++)
		{
            a = j * j - i * i;
            b = 2 * i * j;
            c = i * i + j * j;
			if(c <= input)
			{
				if(1 == is_coprime(a,b) && 1 == is_coprime(b,c) && 1 == is_coprime(a,c))
				{
					countor++;
					printf("a=%d,b=%d,c=%d\n",a,b,c);
				}
			}
		}
	}
	
	printf("%d\n",countor);
	return 0;
}

测试描述

注意事项

编译时链接数学库,-lm

©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值