题目大意:
x1 = x – sqrt(y)
y1 = y – sqrt(x)
题目给出多个x1,y1.求出x,y。如果有多种可能的话,就输出x较小的那一对x,y。
思路:一开始我还以为是纯几何。囧。。后来只好偷看答案了,迭代!神了,因为有2个方程,2个未知数,但是因为不是齐次方程,所以解起来麻烦。
怎么迭代呢?
因为 x= x1+ sqrt(y)
y = y1 + sqrt(x),先把x1,y1存下来之后,把x1,y1当成x,y进行运算,那么得到的x,y肯定是小于真实值的,但是把它累加在保存下来的x1,y1后,之后再把得到的
x,y当成x,y,进行运算,迭代会把累加,逼近x,y的真实值。一句话就是:增加的越来越少的样子,然后像渐近线一样逼近真实值。
program:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main()
{
int test;
scanf("%d",&test);
double x1,y1;
int cas=1;
while(test--)
{
scanf("%lf%lf",&x1,&y1);
double x,y;
double sx=x1,sy=y1;
do
{
x=x1,y=y1;
x1=sx+sqrt(y);
y1=sy+sqrt(x);
}while(x1-x>0.00000001||y1-y>0.00000001);
//其实 X2<X1<X,(Xi都是代入来迭代的东西,虽然在减小,但是还是在累加,所以一直在逼近)
// 两个不满足才跳出 ,
//刚开始时都是大于小数点为5个数的数,但是题目要求输出6个小数,所以要相差度到至少7个小数点才退出循环,
//循环装的都是反条件,都是不良条件,都是直到良好条件停止循环,输出好的,最终要求的东西
printf("Case %d: %.6lf %.6lf\n",cas++,x1,y1);//注意啊,lf不能掉啊
}
//system("pause");
return 0;}
总结:(一针见血):然后一开始把y=y1,x=x1赋值上去迭代,因为x>x1,y>y1;所以这样迭代上去,值会累加。可是为什么累加后值不会超过真实的x与y呢。。。
因为x=x1+sqrt(y1+sqrt(x1));这里面y1+sqrt(x)本来就是小于真实的y的。所以这里迭代上去只能使值越来越靠近真实值,而不会出现迭代上去后,值超过真实值的情况。。
括号里面的内容一直在迭代的时候就像递推式一样的变化。