Question link: Click the open link
Given R1, R2
Represents the radius of two cylinders
The height of these two cylinders is positive and infinite, perpendicular to each other.
#include <stdio.h>#include <string.h>#include <iostream>#include <cmath>#define M 410#define inf 0x3f3f3f3fconst double eps = 1e-8;template <class T>inline bool rd(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; while(c!='-'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); ret*=sgn; return 1;}template <class T>inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if(x>9) pt(x/10); putchar(x%10+'0');}using namespace std;double a, R, r;double F(double x){ return sqrt(R*R-x*x) * sqrt(r*r-x*x);}double simpson(double a, double b){ double c = a + (b-a)/2.0; return (F(a) +4*F(c) + F(b)) * (b-a) / 6.0;}double asr(double a, double b, double eps, double A){ double c = a + (b-a) / 2.0; double L = simpson(a, c), R = simpson(c, b); if(fabs(L+R-A) <= 15*eps) return L+R+(L+R-A)/15.0; return asr(a, c, eps/2.0, L) + asr(c, b, eps/2.0, R);}double asr(double a, double b, double eps){ return asr(a, b, eps, simpson(a,b));}double solve(){ return asr(0, r, eps);}int main(){ while(cin>>R>>r){ if(r>R)swap(r,R); printf("%.4f\n", solve() * 8.0); } return 0;}/*2 3 20 3 2 1 13 0 3 2 02 3 0 1 01 2 1 0 21 0 0 2 0*/
Acdream 1234 two cylinders adaptive Simpson