求解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





