CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

求解C++算法题目

楼主yinyyzz(深蓝)2005-01-07 16:16:19 在 C/C++ / C++ 语言 提问

实数数列:   一个实数数列共有N项,已知:  
     
    Ai=(Ai-1-Ai+1)/2+d  
   
  其中,1<i<N       N<60           (其中的Ai,Ai-1,Ai+1中,i是下标。   )  
   
  使用键盘输入N   d   A1     AN       m,求出Am,并输出。 问题点数:100、回复次数:33Top

1 楼dongyuanzhang(阿林)回复于 2005-01-07 17:00:17 得分 0

请参阅《c语言教程》Top

2 楼dlyy(魑魅魍魉)回复于 2005-01-07 17:09:52 得分 0

m是什么东西??Top

3 楼tyronezx()回复于 2005-01-07 17:16:19 得分 0

用递归Top

4 楼yinyyzz(深蓝)回复于 2005-01-07 18:14:38 得分 0

m是表示其中的任意项Top

5 楼yinyyzz(深蓝)回复于 2005-01-07 18:16:26 得分 0

谁能给出详细的C++程序?再给100分!Top

6 楼popsmart_410108(好好学习,天天向上)回复于 2005-01-07 18:16:50 得分 0

#include   <iostream.h>  
   
  double     a1=1.00;  
  double     an=100.00;  
  double     d=1.00;  
  int           n=60;  
   
  double   foo(int   i)  
  {  
  if(i==1)  
  return   a1;  
  if(i==n)  
  return   an;  
   
  return   (   foo(i-1)+foo(i+1)   )/2   +d;  
  }  
   
  int   main(void)  
  {  
  //cin>>a1>>an>>d;  
  cout<<foo(10)<<endl;  
   
  return   1;  
  }  
  //我尝试用递归,但是没有输出结果  
  //高手请看一下Top

7 楼xiaoqiang085(小弟)回复于 2005-01-07 18:23:35 得分 0

用递归去设计就行了。  
    不会又是期终的考试题目吧!!  
  Top

8 楼popsmart_410108(好好学习,天天向上)回复于 2005-01-07 18:47:39 得分 0

想了一下,foo(10)调用foo(9)与foo(11),而foo(9)又调用foo(8)与foo(10)(这里又调用了foo(10),看来这样做递归应该是行不通的了);  
  看来得把   Ai=(Ai-1-Ai+1)/2+d     变通下   ;  
  关注中~!!!  
  Top

9 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-07 20:12:53 得分 0

Ai-1     -   Ai+1   =   (2+d)Ai  
   
  An-2   -   An   =   (2+d)An-1  
  An-3   -   An-1   =   (2+d)An-2  
  。。。。。。。。。。  
  A1   -   A3   =(2+d)A2  
   
  全相加  
  Sm   -   A1-An   =   (A1   -An)/(2+d)  
  得Sm  
  Sm   =   (2+d)A2   +   A3   +   (2+d)A3+A4+。。。。。。+(2+d)An-1   +An               +An-1   +An  
          =   (2+d)(Sm-A1-An)+(Sm-A1—A2)  
   
  得A2  
  这下依次求每个数!Top

10 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-07 20:21:48 得分 0

这个是Ai=(Ai-1-Ai+1)/2+d  
  还是Ai=(Ai-1-Ai+1)/(2+d)?Top

11 楼popsmart_410108(好好学习,天天向上)回复于 2005-01-07 20:54:02 得分 0

应该不是   Ai=(Ai-1-Ai+1)/(2+d)  
   
  能否把求A2的过程写详细点,Sm表示A1+A2+....An-1   +   An   吗?Top

12 楼yeswelkin(我思故我在)回复于 2005-01-07 21:11:44 得分 0

回复人:   zhengwei1984222(哞哞哞)   (   )   信誉:100   你的错了  
  首先,  
  全相加   Sm   -   A1-An   =   (A1   -An)/(2+d)这里应该是  
  Sn   -   A1-An   =   (A1   +   A2   -   An-1   -   An)/(2+d)  
  并且不知道Sn等于多少  
   
  还有,我觉得题目应该是Ai=((Ai-1-Ai+1)/2)+d  
  Top

13 楼Bread_0053(好好学习,天天向上)回复于 2005-01-07 21:26:14 得分 0

markTop

14 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-07 22:40:25 得分 0

确实错了,抱歉Top

15 楼yinyyzz(深蓝)回复于 2005-01-07 23:38:48 得分 0

真不好意思,在公式   Ai=(Ai-1-Ai+1)/2+d中,i和i-1和i+1都是表示项数的下标。  
  Top

16 楼yinyyzz(深蓝)回复于 2005-01-07 23:39:26 得分 0

真不好意思,在公式   Ai=(Ai-1-Ai+1)/2+d中,i和i-1和i+1都是表示项数的下标。Top

17 楼yinyyzz(深蓝)回复于 2005-01-07 23:40:52 得分 0

真不好意思,在公式   Ai=(Ai-1-Ai+1)/2+d中,i和i-1和i+1都是表示项数的下标。Top

18 楼jitian81411(太阳)回复于 2005-01-07 23:46:24 得分 0

递归调用Top

19 楼wwxsoft(婉儿)回复于 2005-01-08 12:40:06 得分 20

#include   <iostream>  
  #include   <stdlib.h>  
   
  using   namespace   std;  
  long   ff(int   i,int   d)  
  {  
  int   f;  
  int   a[i];  
  if(i==0)  
          cout<<"the   data   is   error1"<<endl;  
  else   if(i==1)  
        {  
        f=1;  
      //cout<<f<<endl;  
        }  
  else    
        {  
          f=(ff(i-2,d)-2*ff(i-1,d)+2*d);  
          //cout<<f<<endl;  
          }  
  }  
  int   main(int   argc,   char   *argv[])  
  {  
      int   a[10];  
      int   i,d;  
      long   f;  
      cout<<"请输入d:";  
      cin>>d;  
      for(i=0;i<10;i++)  
      {  
      cin>>a[i];  
      }  
      f=ff(i,d);  
      system("PAUSE");  
      return   0;  
  }Top

20 楼gambolgs(Gambol)回复于 2005-01-08 13:20:27 得分 0

wwxsoft(婉儿):  
   
  要输入的是A[1]和A[n],你的输入就不对。  
  你是把A[1],A[2]已知然后往后推吧,人家是要从A[1]和A[n]推中间。  
   
  不过system("pause");用得很精妙,学到了!Top

21 楼gambolgs(Gambol)回复于 2005-01-08 13:49:14 得分 0

Ai=(Ai-1-Ai+1)/2+d  
  =〉  
  A[i   +   1]   =   A[i   -   1]   -   2   *   (A[i]   -   d)  
   
  这样一直递推,把A[n]的值用A[1],A[2]表达出来,写成A[n]   =   Coeff.a1   *   A[1]   +   Coeff.a2   *   A[2]   +   Coeff.x的形式  
  有了Coeff.a1,   Coeff.a2,   Coeff.x以后  
  把A[2]算出来即可。  
   
  所以得到的程序是:  
   
  #include   <iostream>  
  #include   <stdlib.h>  
   
  using   namespace   std;  
   
  struct   Coeff   {  
  double   a1,   a2,   x;  
  };  
   
  Coeff   GetCoeff(int   n,   double   d)   //获得A[n]关于A[1],A[2]的表示系数  
  {  
  Coeff   return_value;  
  Coeff   AN_1,   AN_2;   //   A[n   -   2]   和   A[n   -   1]相应的系数  
   
  switch   (n)   {  
  case   1:  
  return_value.a1   =   1;  
  return_value.a2   =   0;  
  return_value.x   =   0;  
  return   return_value;  
  break;  
  case   2:  
  return_value.a1   =   0;  
  return_value.a2   =   1;  
  return_value.x   =   0;  
  return   return_value;  
  break;  
  default:  
  AN_1   =   GetCoeff(n   -   1,   d);  
  AN_2   =   GetCoeff(n   -   2,   d);  
  return_value.a1   =   AN_2.a1   -   2   *   AN_1.a1;  
  return_value.a2   =   AN_2.a2   -   2   *   AN_1.a2;  
  return_value.x   =   AN_2.x   -   2   *   (AN_1.x   -   d);  
  return   return_value;  
  break;  
  }  
  }  
   
  void   main()  
  {  
  int   m,   n;  
  double   A1,   A2,   An,   Am,   d;  
   
  cout   <<   "enter   A1,   An,   m,   n,   d:";  
  cin   >>   A1   >>   An   >>   m   >>   n   >>   d;  
   
  Coeff   coefficient_of_n   =   GetCoeff(m,   d);  
   
  //因为A[n]   =   coefficient_of_n.a1   *   A1   +   coefficient_of_n.a2   *   A2   +   coefficient_of_n.x  
  A2   =   (An   -   coefficient_of_n.a1   *   A1   -   coefficient_of_n.x)   /   coefficient_of_n.a2;  
   
  Coeff   coefficient_of_m   =   GetCoeff(n,   d);   //   这里其实重新算了刚才算过的内容,不过懒得优化了  
  Am   =   coefficient_of_m.a1   *   A1   +   coefficient_of_m.a2   *   A2   +   coefficient_of_m.x;  
   
  cout   <<   "Am   =   "   <<   Am   <<   endl;  
   
  system("pause");  
  }  
   
   
  在VC.NET2003下通过。不过没有测试数据。另外感谢wwxsoft(婉儿)的system("pause")Top

22 楼gambolgs(Gambol)回复于 2005-01-08 13:51:11 得分 0

sorry,   main()里面关键的m,n搞反了,应该是:  
   
  void   main()  
  {  
  int   m,   n;  
  double   A1,   A2,   An,   Am,   d;  
   
  cout   <<   "enter   A1,   An,   m,   n,   d:";  
  cin   >>   A1   >>   An   >>   m   >>   n   >>   d;  
   
  Coeff   coefficient_of_n   =   GetCoeff(n,   d);  
   
  A2   =   (An   -   coefficient_of_n.a1   *   A1   -   coefficient_of_n.x)   /   coefficient_of_n.a2;  
   
  Coeff   coefficient_of_m   =   GetCoeff(m,   d);  
  Am   =   coefficient_of_m.a1   *   A1   +   coefficient_of_m.a2   *   A2   +   coefficient_of_m.x;  
   
  cout   <<   "Am   =   "   <<   Am   <<   endl;  
   
  system("pause");  
  }  
  Top

23 楼rccbox(锐布)回复于 2005-01-08 14:26:48 得分 0

system("pause")  
  是什么意思?Top

24 楼ulwxf2(阿华)回复于 2005-01-08 16:49:26 得分 0

没必要搞得哪么复杂吧!Top

25 楼welfarefanwei(伟大)回复于 2005-01-08 16:56:26 得分 0

system("pause")  
  请分析一下!!Top

26 楼gambolgs(Gambol)回复于 2005-01-08 17:16:21 得分 0

在命令行下面打pause就知道了Top

27 楼diaodou(凋豆)回复于 2005-01-08 20:47:24 得分 0

令   Bn   =   an-d,则   Bi+1   =   Bi-1-2Bi,  
  特征方程为   r^2+2r-1=0,解出两根,r1,r2  
  那么,Bi   =   c1*r1^i+c2*r2^i  
  所以,ai   =   c1*r1^i+c2*r2^i+d  
  这样,根据a1,an,n,d,就可以解出c1,c2,再根据m由公式就可以算出amTop

28 楼boguang(波波)回复于 2005-01-08 22:54:57 得分 0

我看不懂   撒子哦!!!运行不了撒!写清楚点撒,改错误好烦哦!Top

29 楼iicup(双杯献酒)回复于 2005-01-09 01:37:08 得分 30

/*  
  实数数列:   一个实数数列共有N项,已知:  
     
    Ai=(Ai-1-Ai+1)/2+d  
   
  其中,1<i<N       N<60           (其中的Ai,Ai-1,Ai+1中,i是下标。   )  
   
  使用键盘输入N   d   A1     AN       m,求出Am,并输出。  
   
  */  
   
  /*  
  数值算法  
  */  
   
   
  /*    
        VC   6.0  
  */  
   
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  int   main()  
  {  
  int   N   =   0;  
  double   d   =   0.0;  
  double   A[60]   ={0.0};  
  int   m   =   0;  
   
  printf("输入   N   d   A1   AN   m:\n");  
  scanf("%d   %lf",&N,&d);  
  scanf("%lf   %lf   %d",&A[0],&A[N-1],&m);  
   
  for(int   i=0;i<10000;i++)  
  {  
  for(int   j=1;j<N-1;j++)  
  {  
  A[j]   =   (A[j-1]-A[j+1])/2+d;  
  }  
  }  
   
   
  /*   输出   */  
  for(int   k=0;k<N;k++)  
  {  
  printf("A%d   =   %8.2lf",k+1,A[k]);  
  if(k+1   ==   m)   printf("\t\t   //   !!!");  
  printf("\n");  
  }  
   
   
   
    return   0;  
  }  
  /*  
  输入   N   d   A1   AN   m:  
  6   6.0   106.0   -469.0   3  
  A1   =       106.00  
  A2   =         31.00  
  A3   =         56.00                         //   !!!  
  A4   =       -69.00  
  A5   =       206.00  
  A6   =     -469.00  
  */Top

30 楼gambolgs(Gambol)回复于 2005-01-09 09:43:28 得分 0

iicup(双杯献酒)   :  
  虽然大家都用的暴力破解,但是你的暴力破解方法也太彻底了……佩服Top

31 楼wwjj007()回复于 2005-01-09 14:07:41 得分 30

#include   <iostream>  
  #include   <stdlib.h>  
  using   namespace   std;  
  void   main()  
  {  
  int   m,   n;  
  double   A0,   A1,   An,   Am,   d,a0,a1,d0,t,aa0,aa1,dd0;  
  double   x[60]={0};  
  cout   <<   "enter   A1,   An,   m,   n,   d:";  
  cin   >>   A0   >>   An   >>   m   >>   n   >>   d;  
  a1   =   -2;  
  aa1   =   1;  
  a0=1;  
  aa0=0;  
  d0=2;  
  dd0=0;  
  for   (   int   i   =   3;i<=n;i++)  
  {  
  t   =   a1;  
  a1=a1*(-2)+aa1;  
  aa1   =   t;  
  t   =   a0;  
  a0   =   a0*(-2)   +   aa0;  
  aa0   =   t;  
  t   =   d0;  
  d0   =   (d0-1)*(-2)   +   dd0;  
  dd0   =   t;  
  }  
  A1   =   (An   -   a0   *   A0   -   d0*d)   /   a1;  
  x[0]=A0;  
  x[1]=A1;  
  cout<<x[0]<<endl;  
  cout<<x[1]<<endl;  
  for   (   i   =   2;i<=n;i++)  
  {  
  x[i]=   x[i-2]   -   2*(x[i-1]-d);  
  cout<<x[i]<<endl;  
  }  
  Am   =   x[m];  
  cout   <<   "Am   =   "   <<   Am   <<   endl;  
  }Top

32 楼zhengwei1984222(阿什坎迪.兄弟会之剑)回复于 2005-01-09 20:07:37 得分 20

用渐进法  
  #include   <iostream>  
  #include   <assert.h>  
  #include   <math.h>  
   
  using   namespace   std;  
   
  void   main()  
  {  
  const   double   PRECISION   =   10e-7;  
  int   Count   =   0   ;  
  double   FirstElem   ,LastElem   ,Division,   *Array;  
  cout<<"数组大小:"<<endl;  
  cin>>Count;  
  cout<<"输入数组第一个元素:"<<endl;  
  cin>>FirstElem;  
  cout<<"最后一个元素:"<<endl;  
  cin>>LastElem;  
  cout<<"输入d:"<<endl;  
  cin>>Division;  
  Array   =   new   double   [Count];  
  Array[0]   =   FirstElem;  
  Array[Count   -   1]   =   LastElem;  
  assert(Count>=3);  
  memset(Array   +   1   ,   0   ,(Count-1)*sizeof(double));  
  int   j=0;  
  while   (1)  
  {  
  for(int   i   =1;i<Count-1;i++)  
  Array[i+1]   =   Array[i-1]   -   Array[i]/Division   -   2;  
  if(fabs(Array[i]   -   LastElem)   <   PRECISION)  
  break;  
  Array[Count   -   1]   =   LastElem;  
  Array[i-1]   =   (Array[i-1]   +   (Array[i-2]   -   LastElem   -   2)*Division   )/2;  
  for(;i>1;i--)  
  Array[i-2]=   Array[i]   +   Array[i-1]   /Division   +2;  
  if(fabs(Array[i-1]   -   FirstElem)   <   PRECISION)  
  break;  
  Array[0]   =   FirstElem;  
  Array[i]   =   (Array[i]   +   (FirstElem   -   Array[i+1]   -2)*Division   )/2;  
  }  
  cout<<"数组中各元素为:"<<endl;  
  for   (int   i   =   0;i<Count;i++)  
  cout<<Array[i]<<"           ";  
  }  
  Top

33 楼gambolgs(Gambol)回复于 2005-01-11 14:38:08 得分 0

楼主你给分之前把程序都运行过吗?Top

相关问题

  • 求解C++算法题目
  • C题目,求解!
  • 纸牌游戏的C算法求解
  • 算法求解
  • 求解算法
  • 求解八皇后问题算法(C语言版)
  • 求解一般线性方程组的算法及C程序
  • 算法求教:古老的数学问题.用C求解
  • 求解算法,急
  • 求解一算法

关键词

  • ai
  • coefficient
  • coeff
  • getcoeff
  • firstelem
  • lastelem
  • double
  • cout
  • array
  • division

得分解答快速导航

  • 帖主:yinyyzz
  • wwxsoft
  • iicup
  • wwjj007
  • zhengwei1984222

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...

社区焦点:

教你怎样用C#搞笑整人
最懒惰的程序员写的Cache
程序员如何掌握专业英语
Java栈与堆
分享:让人懊恼的面试
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo