快捷搜索: 王者荣耀 脱发

华为机试——素勾股数

题目描述

* 题目:勾股数,是由三个正整数组成的数组;能符合勾股定理 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
",a,b,c);
				}
			}
		}
	}
	
	printf("%d
",countor);
	return 0;
}

测试描述

注意事项

编译时链接数学库,-lm

经验分享 程序员 微信小程序 职场和发展