主题:三重循环求和
晚秋2012
[专家分:0] 发布于 2011-05-07 00:21:00
请各位大虾帮忙看看应该怎样修改才能得到正确结果:1.7627
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
void main()
{
int n1=100,n2=100,n3=100,i,j,k;//n1,n2,n3初始化 可以任意设置
double sum=0.0; //sum初始化
double a,m,n; //m:分子 n:分母
do
{ /*三重求和循环*/
for(i=-n1;i<=n1;i++)
{
for(j=-n2;j<=n2;j++)
{
for(k=-n3;k<=n3;k++)
{
if(i==0&&j==0&&k==0)
continue;
else
{
m=pow(-1.0,n1+n2+n3);
n=sqrt(pow((-n1+n2+n3),2.0)+pow((n1-n2+n3),2.0)+pow((n1+n2-n3),2.0));
a=2*m/n;
sum=sum+a;
}
}
}
}
}while(a>=1e-6);
printf("A的值=%6.6f",sum); //结果
}
回复列表 (共18个回复)
沙发
晚秋2012 [专家分:0] 发布于 2011-05-07 00:23:00
顶一下!十万火急,大家一定要帮帮我呀!小弟在此先谢了
板凳
bruceteen [专家分:42660] 发布于 2011-05-07 09:16:00
看到不好好排版的代码就蛋疼
pow(-1.0,n1+n2+n3); 应该是 i+j+k 吧,其它类似
3 楼
晚秋2012 [专家分:0] 发布于 2011-05-07 12:00:00
楼主说的有理,可是n1,n2,n3的值设置较大时,VC会运行很久,不知道怎么修改才能降低时间复杂度,希望大家给点建议。
4 楼
cxxcomp [专家分:2370] 发布于 2011-05-08 02:27:00
公式可以做适当简化, 不考虑分母的1/2, 提到求和号外. 分子不采用pow, 函数调用,出入栈是需要时间的, 分子无非是个符号而已. 偶数为正,奇数为负. 最终,简化为1/sqrt(P^2 + Q^2 + R^2)形式. 而这个形式是可以采用快速算法的. 我计算了下, 最短时间,n1, n2, n3 为500时,用时11秒. 但遗憾的是, 结果不是1.7627. 累加结果稳定在0.35628
暂时没找到原因......
to be continue...
5 楼
万里江山 [专家分:10] 发布于 2011-05-08 10:55:00
那个while循环也不对,只是无用的重复相加而已。
6 楼
晚秋2012 [专家分:0] 发布于 2011-05-08 12:19:00
我把程序修改了一下,将do-while循环去掉,设置n1,n2,n3为100时,结果为-2.027989,
include<stdlib.h>
#include<stdio.h>
#include<math.h>
void main()
{
int n1=100,n2=100,n3=100,i,j,k;//n1,n2,n3初始化 可以任意设置
double sum=0.0; //sum初始化
double a,m,n; //m:分子 n:分母
//do
//{ /*三重求和循环*/
for(i=-n1;i<=n1;i++)
{
for(j=-n2;j<=n2;j++)
{
for(k=-n3;k<=n3;k++)
{
if(i==0&&j==0&&k==0)
continue;
else
{
m=pow(-1.0,i+j+k);
n=sqrt(pow((-i+j+k),2.0)+pow((i-j+k),2.0)+pow((i+j-k),2.0));
a=m/n;
sum=sum+a;
}
}
}
}
//}while(a>=1e-6);
printf("A的值=%6.6f",sum*2); //结果
}
7 楼
晚秋2012 [专家分:0] 发布于 2011-05-08 12:23:00
排版有点差,想问大家A的精度误差应该怎样表示,是a>=1e-6吗?[em18]
8 楼
晚秋2012 [专家分:0] 发布于 2011-05-10 12:29:00
[em1][em1] 怎么没人顶?
9 楼
cgl_lgs [专家分:21040] 发布于 2011-05-10 14:43:00
上一个a减去当前的a的差值的绝对值小于1e-6。
10 楼
killergsm [专家分:90] 发布于 2011-05-10 16:20:00
我觉得那个&&应当换成||吧,不过结果还是为负,我稍微排版了一下
#include <stdlib.h>
#include<stdio.h>
#include<math.h>
void main()
{
int n1=100,n2=100,n3=100,i,j,k;//n1,n2,n3初始化 可以任意设置
double sum=0.0; //sum初始化
double a,m,n; //m:分子 n:分母
//do
//{ /*三重求和循环*/
for(i = -n1;i <= n1; i++)
{
for(j = -n2; j <= n2; j++)
{
for(k = -n3; k <= n3; k++)
{
if(i==0 && j==0 && k==0)
continue;
else
{
m = pow(-1.0,i+j+k);
n = sqrt(pow((-i+j+k),2.0)+pow((i-j+k),2.0)+pow((i+j-k),2.0));
a=m/n;
sum=sum+a;
}
}
}
}
//}while(a>=1e-6);
printf("A的值=%6.6f",sum * 2); //结果
getch();
}
我来回复