求会C的大佬解答

江晚愁余 2019-04-09 01:16:50
给定一个方程. p*p-8q*q=1,其中p, q都为正整数。输出最小的10对满足此方程的数对 (p,q).
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
正整数...
江晚愁余 2019-04-09
  • 打赏
  • 举报
回复
刚刚自己想出来的……
江晚愁余 2019-04-09
  • 打赏
  • 举报
回复
#include "pch.h" #include <iostream> #include<math.h> int main() { long int p, q,t,i,x,y; i = 1; for (t=1;i<11 ; t++) { p = 2 * t -1; if (t % 2 == 0) { x = sqrt(t / 2); y = sqrt(t - 1); q = x * y; if (x*x == t / 2 && y*y == t - 1) { printf("(%d,%d)%d\n", p, q, t); i++; } } else { x = sqrt(t); y = sqrt(t / 2 - 1 / 2); q = x * y; if (x*x == t&& y*y == t/2 - 1/2) { printf("(%d,%d)%d\n", p, q, t); i++; } } } return 0; }
江晚愁余 2019-04-09
  • 打赏
  • 举报
回复
引用 1 楼 jsx_SEVEN的回复:

int main()
{
	int p, q;
	int n = 0;
	for ( p = 1; n<10; p++)
	{
		for ( q = 1; q < p && n<10; q++)
		{
			if (p*p - 8 * q*q == 1)
			{
				printf("(%d,%d)\n", p, q);
				n++;
			}
		}

	}
}
问题是这个方法算到第六组就开始出错了
刘蕘 2019-04-09
  • 打赏
  • 举报
回复
引用 4 楼 LubinLew的回复:
上面的程序中long改成int 可以秒出结果, 不甚明白

#include <stdio.h>

#define MAX ~0U

int main(void)
{
unsigned int p, q;
int result;
int count = 0;

printf("MAX=%u\n", MAX);

for (q = 1; q < MAX; ++q) {
for (p = 2 * q + 1; p < MAX; ++p) {
result = p * p - 8 * q * q -1;
if (result == 0) {
++count;
printf("[%.2d]q=%-10u p=%-10u\n", count, q, p);

if (count == 10) {
return 0;
}
break;
}
else if (result > 0) {
break;
}
}
}

return 0;
}

因为改成int超过int的范围了
  • 打赏
  • 举报
回复
最简单的解法:

#include <stdio.h>
#include <math.h>

int main()
{
for (int n = 0, q = 1; n < 10; q++)
if ((long long)sqrt(8.0 * q * q + 1) == sqrt(8.0 * q * q + 1))
printf("%lld %d\n", (long long)sqrt(8.0 * q * q + 1), q), n++;

return 0;
}
// 输出
3 1
17 6
99 35
577 204
3363 1189
19601 6930
114243 40391
665857 235416
3880899 1372105
22619537 7997214

LubinLew 2019-04-09
  • 打赏
  • 举报
回复
上面的程序中long改成int 可以秒出结果, 不甚明白

#include <stdio.h>

#define MAX ~0U

int main(void)
{
unsigned int p, q;
int result;
int count = 0;

printf("MAX=%u\n", MAX);

for (q = 1; q < MAX; ++q) {
for (p = 2 * q + 1; p < MAX; ++p) {
result = p * p - 8 * q * q -1;
if (result == 0) {
++count;
printf("[%.2d]q=%-10u p=%-10u\n", count, q, p);

if (count == 10) {
return 0;
}
break;
}
else if (result > 0) {
break;
}
}
}

return 0;
}

LubinLew 2019-04-09
  • 打赏
  • 举报
回复
这题挺恶心的, 以我的数学能力就能得出 p > 2倍根号2 这个结论, 然而我的机器顶多算到第8对,后面2对十几分钟也没出来,
不知道越界没有, 数学好的老哥看看, 有没有什么优化的方法


#include <stdio.h>

#define MAX ~0UL

int main(void)
{
unsigned long p, q;
long result;
int count = 0;

printf("MAX=%lu\n", MAX);

for (q = 1; q < MAX; ++q) {
for (p = 2 * q + 1; p < MAX; ++p) {
result = p * p - 8 * q * q -1;
if (result == 0) {
++count;
printf("[%.2d]q=%-10lu p=%-10lu\n", count, q, p);

if (count == 10) {
return 0;
}
break;
}
else if (result > 0) {
break;
}
}
}

return 0;
}

636f6c696e 2019-04-09
  • 打赏
  • 举报
回复
q=1开始硬搜,没啥好办法吧
周末ZhouMo 2019-04-09
  • 打赏
  • 举报
回复

int main()
{
	int p, q;
	int n = 0;
	for ( p = 1; n<10; p++)
	{
		for ( q = 1; q < p && n<10; q++)
		{
			if (p*p - 8 * q*q == 1)
			{
				printf("(%d,%d)\n", p, q);
				n++;
			}
		}

	}
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧