回 帖 发 新 帖 刷新版面

主题:三重循环求和


请各位大虾帮忙看看应该怎样修改才能得到正确结果: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个回复)

沙发


顶一下!十万火急,大家一定要帮帮我呀!小弟在此先谢了

板凳

看到不好好排版的代码就蛋疼
pow(-1.0,n1+n2+n3); 应该是 i+j+k 吧,其它类似

3 楼

楼主说的有理,可是n1,n2,n3的值设置较大时,VC会运行很久,不知道怎么修改才能降低时间复杂度,希望大家给点建议。

4 楼

公式可以做适当简化, 不考虑分母的1/2, 提到求和号外. 分子不采用pow, 函数调用,出入栈是需要时间的, 分子无非是个符号而已. 偶数为正,奇数为负. 最终,简化为1/sqrt(P^2 + Q^2 + R^2)形式. 而这个形式是可以采用快速算法的. 我计算了下, 最短时间,n1, n2, n3 为500时,用时11秒. 但遗憾的是, 结果不是1.7627. 累加结果稳定在0.35628  
暂时没找到原因......
to be continue...

5 楼

那个while循环也不对,只是无用的重复相加而已。

6 楼


我把程序修改了一下,将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 楼


排版有点差,想问大家A的精度误差应该怎样表示,是a>=1e-6吗?[em18]

8 楼


[em1][em1] 怎么没人顶?

9 楼

上一个a减去当前的a的差值的绝对值小于1e-6。

10 楼

我觉得那个&&应当换成||吧,不过结果还是为负,我稍微排版了一下
#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();
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册