博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HNU 11722 The Gougu Theorem
阅读量:5085 次
发布时间:2019-06-13

本文共 1583 字,大约阅读时间需要 5 分钟。

HNU_11722

    由于勾股数a,b,c可以表示成a=m^2-n^2,b=2*m*n,c=m^2+n^2,因此可以枚举n找到所有可能的互素的勾股数,然后去掉其中重复的解即可。

    这个题目还可以用一个剪枝,就是如果c%4 !=1的话一定无解。

#include
#include
#include
#include
#define MAXD 60000 int C, a[MAXD], b[MAXD], r[MAXD]; int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y); } int cmp(const void *_p, const void *_q) {
int *p = (int *)_p, *q = (int *)_q; return a[*p] - a[*q]; } void solve() {
int i, j, k, t, n, cnt, x, y; k = (int)sqrt(C + 0.5); n = 0; for(i = 1; i <= k; i ++) {
j = (int)sqrt(C - i * i + 0.5); if(i < j && i * i + j * j == C) {
x = j * j - i * i, y = 2 * i * j; if(gcd(x, y) == 1 && gcd(x, C) == 1 && gcd(y, C) == 1) {
if(x > y) t = x, x = y, y = t; a[n] = x, b[n] = y; ++ n; } } } for(i = 0; i < n; i ++) r[i] = i; qsort(r, n, sizeof(r[0]), cmp); for(cnt = i = 0; i < n; i ++) if(!i || a[r[i]] != a[r[i - 1]]) ++ cnt; printf("There are %d solution(s).\n", cnt); for(i = 0; i < n; i ++) if(!i || a[r[i]] != a[r[i - 1]]) printf("%d^2 + %d^2 = %d^2\n", a[r[i]], b[r[i]], C); } int main() {
int t = 0; for(;;) {
scanf("%d", &C); if(!C) break; printf("Case %d:\n", ++ t); if(C % 4 != 1) printf("There are 0 solution(s).\n"); else solve(); printf("\n"); } return 0; }

 

转载于:https://www.cnblogs.com/staginner/archive/2012/02/22/2362935.html

你可能感兴趣的文章
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
两种最常用的Sticky footer布局方式
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>