重新做华为的机试题

语言: CN / TW / HK

重新写一道华为机试算法题

很少做算法题,上次做华为算法题没准备,做的时候完全是懵的,反倒是现在想起来了,就来说说这道题怎么做. 现在也只是记住当时的大概意思,将就着理解吧:

就是输入两个数N,M,且N<M,找出并打印N,M两个数之间互为质数的勾股数组,例如N=1,M=10,打印的结果为3,4,5(升序),而另一组勾股数6,8,10不是互质的就不打印,如果N,M,之间没有一组这样的数就打印NA.

由于忘了两个数互质的条件,当时没做出来,现在才想起来只要判断两个数的因数都没有2,3,5,那么这两个数就互质,现在一组数有三个,就要判断两两互质的情况,只要有一对数互质就不满足三数互质. 代码奉上:

package main

import "fmt"

func tool(a, b, c int) bool {
	//任意两个参数有约数2
	if (a%2 == 0 && b%2 == 0) || (a%2 == 0 && c%2 == 0) || (b%2 == 0 && c%2 == 0) {
		return false
	}
	//约数3
	if (a%3 == 0 && b%3 == 0) || (a%3 == 0 && c%3 == 0) || (b%3 == 0 && c%3 == 0) {
		return false
	}
	//约数5
	if (a%5 == 0 && b%5 == 0) || (a%5 == 0 && c%5 == 0) || (b%5 == 0 && c%5 == 0) {
		return false
	}

	return true

}

var n = 0 //标记组数

func main() {
	N := 0
	M := 0

	fmt.Scan(&N)
	fmt.Scan(&M)

	for a := N; a < M-2; a++ {
		aa := a * a
		for b := a + 1; b < M-1; b++ {
			bb := b * b
			for c := b + 1; c <= M; c++ {
				cc := c * c
				if aa+bb == cc {
					if tool(a, b, c) {
						n++//组数+1
						fmt.Println(a, b, c)
					}
				}
			}
		}
	}

	if n == 0 {
		fmt.Println("NA")
	}

}
分享到: