注册 登录
编程论坛 C++教室

已知n/2是完全平方数,n/3是立方数,编写一个程序求最小的正整数n.

williamlyf 发布于 2007-08-30 19:55, 4710 次点击
已知n/2是完全平方数,n/3是立方数,编写一个程序求最小的正整数n。
21 回复
#2
雨中飞燕2007-08-30 21:01
心算都可以了,只有一个数648



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]
#3
圆圆的鸟蛋2007-08-30 23:00
LS,太拽了。。真的是心算的?
#4
雨中飞燕2007-08-30 23:09
哦~~~~不对,是648 * a^6,其中a是任意一个与2和3都互质的正整数(1,5,7,11,25等等)
这就是所有的解了


by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]

[此贴子已经被作者于2007-8-30 23:11:33编辑过]

#5
雨中飞燕2007-08-30 23:13
心算的方法是6的三次方再乘以3就是答案



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]
#6
HJin2007-08-30 23:14
回复:(williamlyf)已知n/2是完全平方数,n/3是立方数...

/*---------------------------------------------------------------------------
File name: 648.c
Author: HJin (email: fish_sea_bird [at] yahoo [dot] com )
Created on: 8/30/2007 08:12:36
Environment: Windows XP Professional SP2 English +
Visual Studio 2005 v8.0.50727.762


Modification history:
===========================================================================


Problem statement:
---------------------------------------------------------------------------
https://bbs.bc-cn.net/viewthread.php?tid=166576
已知n/2是完全平方数,n/3是立方数,编写一个程序求最小的正整数n。


Analysis:
---------------------------------------------------------------------------
n/2=a*a
n/2=b*b*b

implies 2*a*a = 3*b*b*b.


雨中飞燕:
心算都可以了,只有一个数648


When it is said "最小的正整数n", it is certain we have at most one solution.


Sample output:
---------------------------------------------------------------------------
n=648
Press any key to continue . . .


*/

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

int main()
{
int a, b, c;

/**
for this kind of problem, you can apply binary search:
since
1, 4, 9, 16, 25, ...
1, 8, 27, 64, 125, ...
are ordered.

Following code does not use binary search, instead it is a
burte force search.
*/

for(b=1; b<100000; ++b)
{
c=(int)sqrt(1.5*b*b*b);
for(a=1; a<=c; ++a)
{
if(2*a*a==3*b*b*b)
{
printf("n=%d\n", 2*a*a);
return 0;
}
}
}

return 0;
}

[此贴子已经被作者于2007-8-30 23:16:24编辑过]

#7
圆圆的鸟蛋2007-08-30 23:45

楼上,利害!!
我也写了一个,效率太低,,呵呵

//这个数必然是6的倍数
#include <iostream>
#include <cmath>
using namespace std ;

bool IsThree(const int n)
{
int i ;
bool res = false ;
for(i=2; i<n/3; i+=2)
{
if(i*i*i == n)
{
res = true ;
return res ;
}
}

return res ;
}

bool IsTwo(const int n)
{
int i ;
bool res = false ;

if(sqrt(n) == (int)sqrt(n))
{
res = true ;
}

return res ;
}

void GetNum(int &num)
{
while(!(IsTwo(num/2) && IsThree(num/3)))
{
num += 6;
}
}

int main()
{
int m_num = 6 ;

GetNum(m_num) ;

cout << m_num << endl ;

return 0 ;
}

[此贴子已经被作者于2007-8-31 0:06:39编辑过]

#8
雨中飞燕2007-08-31 00:19
数学的力量是很强大的~~~~~~~~~~~~~~~



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
C/C++算法习题(OnlineJudge):[url]http://yzfy.org/[/url]
#9
醉生梦死2007-08-31 01:10
回复:(HJin)回复:(williamlyf)已知n/2是完全平方...

呵呵!做了点小改动
好像效率能高点
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
for (int i=1;i<100000;i++)
{
int c=int(sqrt(1.5*i*i*i));
if(2*c*c==3*i*i*i)
{
cout<<2*c*c<<endl;
break;
}
}

return 0;
}

#10
圆圆的鸟蛋2007-08-31 09:57
c=(int)sqrt(1.5*b*b*b);
这句话的作用是什么呢??为什么要这样写??
#11
zjxtx44312007-08-31 21:50

数字这么小,在6的公倍数里递增穷举不是很简单?
int i,j;
for(i=1;i<=10000;i++){
j=i*6;
if(pow(pow(j/3,1/3),3)==j/3 && pow(sqrt(j/2),2)==j/2){
printf("%d",i);
break;
}
}

#12
williamlyf2007-09-02 08:58
啊~~~~~~~~~~~~~~~~~~~~~~厉害,佩服,谢谢!

谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!谢谢!谢谢!
谢谢!谢谢!谢谢!
谢谢!
#13
aipb20072007-09-02 13:25
以下是引用圆圆的鸟蛋在2007-8-31 9:57:58的发言:
c=(int)sqrt(1.5*b*b*b);
这句话的作用是什么呢??为什么要这样写??

sqrt开方函数

因为2*a*a = 3*b*b*b
所以a*a = 3/2 *b*b*b

#14
nuciewth2007-09-02 14:09
以下是引用zjxtx4431在2007-8-31 21:50:48的发言:

数字这么小,在6的公倍数里递增穷举不是很简单?
int i,j;
for(i=1;i<=10000;i++){
j=i*6;
if(pow(pow(j/3,1/3),3)==j/3 && pow(sqrt(j/2),2)==j/2){
printf("%d",i);
break;
}
}

i=6;
while(1)
{
a=(int)sqrt(i/2);
b=(int)pow(i/3,1.0/3);
if(a*a*2==i&&b*b*b*3==i)
{
printf("%d\n",i);
break;
}
i+=6;
}

#15
远去的列车2007-09-03 10:36


float a = sqrt(1.5*i*i*i);
if (a == (int)a) // 开平方是个整数就行了
{
cout << 3*i*i*i << endl;
break;
}

#16
圆圆的鸟蛋2007-09-03 12:27
以下是引用aipb2007在2007-9-2 13:25:52的发言:

sqrt开方函数

因为2*a*a = 3*b*b*b
所以a*a = 3/2 *b*b*b

原来如此。。多谢

#17
snakeImao2007-09-15 22:17
1.5*b*b*b==3/2*b*b*b;
而n=3*b*b*b;
n==sqrt(n/2);
所以n=sqrt(1.5*b*b*b)
#18
雨中飞燕2007-09-16 02:12
以下是引用aipb2007在2007-9-2 13:25:52的发言:

sqrt开方函数

因为2*a*a = 3*b*b*b
所以a*a = 3/2 *b*b*b

a*a = 3/2 *b*b*b
a*a = b*b*b*3/2
令b=2^m*3^n*k
a*a = 2^(3m-1) * 3^(3n+1) * k^3
可得到通解:
a = 2^((3m-1)/2) * 3^((3n+1)/2) * k^1.5
当m=n=1,k=0的时候就能得到一组最小的解



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/

[此贴子已经被作者于2007-9-16 2:12:50编辑过]

#19
wangweicoin2007-09-16 08:43

那个girl版主很强嘛!大家也都很厉害,问一下,楼上经常用的^是什么符号?就是(b=2^m*3^n*k)中的,不会是异或吧?

#20
雨中飞燕2007-09-16 09:06
a^b表示a的b次方


by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/

[此贴子已经被作者于2007-9-16 9:06:43编辑过]

#21
wangweicoin2007-09-16 09:20
谢谢楼上!!!
我也来改一下Hjin大侠的程序:
[CODE]#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double a;
int b;
for(b=1; b<100000; ++b)
{
a=sqrt(1.5*b*b*b);
if(a==(int)a)
{
cout<<2*a*a;
break;
}
}
return 0;
}[/CODE]
#22
tzfznb2007-09-16 10:04
额,我数学特别是大学里的数学还有什么函数什么之类的都很差 如果要我学编程那还要先学这些数学??
1