TSC999 发表于 2017-4-28 21:55:43

本帖最后由 TSC999 于 2017-4-28 21:56 编辑

由 0-1110 网友找到的更小的整边等腰梯形:(周长为 226)

mathe 发表于 2017-4-30 20:24:55

Perimeter:60, Area:150, SumOfDiagonal:38
      AB:11,BC:14,CD:15,DA:20, BD:13
      AB:15,BC:20,CD:21,DA:4, BD:13
Perimeter:60, Area:150, SumOfDiagonal:37
      AB:8,BC:12,CD:25,DA:15, BD:17
      AB:9,BC:16,CD:20,DA:15, BD:12
Perimeter:80, Area:300, SumOfDiagonal:50
      AB:11,BC:14,CD:25,DA:30, BD:25
      AB:15,BC:15,CD:25,DA:25, BD:20
Perimeter:84, Area:336, SumOfDiagonal:53
      AB:11,BC:17,CD:26,DA:30, BD:25
      AB:3,BC:25,CD:30,DA:26, BD:25
Perimeter:108, Area:504, SumOfDiagonal:67
      AB:17,BC:25,CD:40,DA:26, BD:25
      AB:3,BC:39,CD:40,DA:26, BD:25
Perimeter:120, Area:600, SumOfDiagonal:75
      AB:25,BC:25,CD:40,DA:30, BD:25
      AB:11,BC:39,CD:40,DA:30, BD:25
Perimeter:120, Area:600, SumOfDiagonal:76
      AB:22,BC:28,CD:30,DA:40, BD:26
      AB:30,BC:40,CD:42,DA:8, BD:26
Perimeter:90, Area:300, SumOfDiagonal:55
      AB:11,BC:14,CD:40,DA:25, BD:30
      AB:20,BC:20,CD:25,DA:25, BD:15
Perimeter:100, Area:360, SumOfDiagonal:54
      AB:13,BC:13,CD:37,DA:37, BD:30
      AB:6,BC:25,CD:40,DA:29, BD:25
Perimeter:120, Area:600, SumOfDiagonal:74
      AB:16,BC:24,CD:50,DA:30, BD:34
      AB:18,BC:32,CD:40,DA:30, BD:24

mathe 发表于 2017-4-30 20:30:09

上面好像包含四边形退化为三角形的情况,去除上面的情况可以得出:
Perimeter:100, Area:360, SumOfDiagonal:54
      AB:13,BC:13,CD:37,DA:37, BD:30
      AB:6,BC:25,CD:40,DA:29, BD:25
Perimeter:200, Area:1440, SumOfDiagonal:108
      AB:26,BC:26,CD:74,DA:74, BD:60
      AB:12,BC:50,CD:80,DA:58, BD:50
Perimeter:252, Area:1890, SumOfDiagonal:126
      AB:26,BC:35,CD:100,DA:91, BD:75
      AB:36,BC:51,CD:90,DA:75, BD:51
Perimeter:226, Area:2700, SumOfDiagonal:150
      AB:32,BC:53,CD:88,DA:53, BD:75
      AB:13,BC:68,CD:77,DA:68, BD:75
Perimeter:276, Area:4092, SumOfDiagonal:187
      AB:50,BC:76,CD:105,DA:45, BD:85
      AB:26,BC:80,CD:85,DA:85, BD:85
Perimeter:300, Area:3240, SumOfDiagonal:162
      AB:39,BC:39,CD:111,DA:111, BD:90
      AB:18,BC:75,CD:120,DA:87, BD:75
Perimeter:276, Area:4092, SumOfDiagonal:187
      AB:45,BC:50,CD:76,DA:105, BD:102
      AB:26,BC:80,CD:85,DA:85, BD:85
Perimeter:400, Area:5760, SumOfDiagonal:216
      AB:52,BC:52,CD:148,DA:148, BD:120
      AB:24,BC:100,CD:160,DA:116, BD:100
Perimeter:314, Area:4200, SumOfDiagonal:250
      AB:108,BC:37,CD:132,DA:37, BD:125
      AB:122,BC:57,CD:122,DA:13, BD:125
Perimeter:394, Area:9408, SumOfDiagonal:280
      AB:99,BC:85,CD:125,DA:85, BD:140
      AB:113,BC:99,CD:113,DA:69, BD:140

TSC999 发表于 2017-4-30 22:37:55

对于上面那组红色数据画图——



四边形面积计算:

a = 102; b = 76; c = 50; a1 = 102; b1 = 105; c1 = 45;
s1 = 1/4 Sqrt[(a^2 + b^2 + c^2)^2 - 2 (a^4 + b^4 + c^4)] +
1/4 Sqrt[(a1^2 + b1^2 + c1^2)^2 - 2 (a1^4 + b1^4 + c1^4)]

a = 85; b = 85; c = 26; a1 = 85; b1 = 85; c1 = 80;
s2 = 1/4 Sqrt[(a^2 + b^2 + c^2)^2 - 2 (a^4 + b^4 + c^4)] +
1/4 Sqrt[(a1^2 + b1^2 + c1^2)^2 - 2 (a1^4 + b1^4 + c1^4)]

面积均为 4092。

TSC999 发表于 2017-4-30 22:51:10

谢谢 mathe 的例子,确实给出了周长和面积更小的、非等腰梯形的甲乙四边形对。

mathe 发表于 2017-5-1 07:03:42

第一组周长100更小,是最小的解。红色解只是和前面一个重复了

mathe 发表于 2017-5-1 09:30:54

这是搜索用的代码
#include <math.h>
#include <stdio.h>
#include <map>
#include <vector>
#define MAX_ERR 0.00001
#define MAX_DIAG 300
using namespace std;
typedef struct _two_edges{
    int i;
    int j;
}two_edges;
typedef vector<two_edges> two_edges_set;
typedef struct _quadrilateral{
    int a,b,c,d;
    int diagonal;
}quadrilateral;

typedef struct _resultql{
    int perimeter;
    int area;
    int sumdiag;
    bool operator<(const struct _resultql& ql)const{
      if(perimeter<ql.perimeter)return true;
      if(perimeter>ql.perimeter)return false;
      if(area<ql.area)return true;
      if(area>ql.area)return false;
      return sumdiag<ql.sumdiag;
    }
}resultql;
typedef map<resultql, quadrilateral> result_map;
double getaera(int a, int b, int c)
{
   double ss=a+b+c;
   ss*=a+b-c;
   ss*=a-b+c;
   ss*=b+c-a;
   return sqrt(ss)/4.0;
}

double getA(int a, int b, int c)
{
   double ss=b*b+c*c-a*a;
   ss/=2*b*c;
   if(ss>1.0)ss=1.0;if(ss<-1.0)ss=-1.0;
   return acos(ss);
}

double get_c(int a, int b, double C)
{
    double ss=a*a+b*b-2*a*b*cos(C);
    return sqrt(ss);
}

void list_triange_of_max_edge(int e, two_edges_set& result)
{
    int i,j;
    result.clear();
    for(i=1;i<=MAX_DIAG;i++){
       int s=e-i+1;
       int d=e+i-1;
       if(s<i)s=i;
       if(d>=MAX_DIAG-i)d=MAX_DIAG-i;
       for(j=s;j<=d;j++){
            double s=4.0*getaera(e,i,j);
            if(fabs(s-round(s))<MAX_ERR){//found a candidate triangle
                two_edges es;
                es.i=i;es.j=j;
                result.push_back(es);
            }
       }
    }
}

void put_result(result_map& result, const resultql& ql, const quadrilateral& q)
{
    result_map::iterator it=result.find(ql);
    if(it==result.end()){
      result.insert(make_pair(ql, q));
    }else{
      const quadrilateral& q2=it->second;
      if(q2.a==q.b&&q2.b==q.c&&q2.c==q.d&&q2.d==q.a)
            return;
      if(q2.a==q.d&&q2.b==q.a&&q2.c==q.b&&q2.d==q.c)
            return;
      if(q2.a==q.c&&q2.b==q.b&&q2.c==q.a&&q2.d==q.d)
            return;
      if(q2.a==q.a&&q2.b==q.d&&q2.c==q.c&&q2.d==q.b)
            return;
      printf("Perimeter:%d, Area:%d, SumOfDiagonal:%d\n", ql.perimeter, ql.area, ql.sumdiag);
      printf("\tAB:%d,BC:%d,CD:%d,DA:%d, BD:%d\n",q.a,q.b,q.c,q.d,q.diagonal);
      printf("\tAB:%d,BC:%d,CD:%d,DA:%d, BD:%d\n",q2.a,q2.b,q2.c,q2.d, q2.diagonal);
    }
}

void list_result_map(int diag, result_map& result)
{
   two_edges_set es;
   list_triange_of_max_edge(diag, es);
   int count = es.size();
   int i,j;
   for(i=0;i<count;++i){
         double s1=getaera(diag, es.i, es.j);
         double A1 = getA(es.j, diag, es.i);
         double A2 = getA(es.i, diag, es.j);
         for(j=i; j<count; ++j){
             double s2=getaera(diag, es.i, es.j);
             if(fabs(s1+s2-round(s1+s2))>=MAX_ERR)continue;//The sum of two triangle must be integer
             double B1 = getA(es.j, diag, es.i);
             double c1 = get_c(es.i, es.i, A1+B1);
             if(fabs(c1-round(c1))<MAX_ERR){//found one result
                int d2=(int)round(c1);
                if(d2<es.i+es.i&&d2<es.j+es.j){
                  resultql ql;
                  ql.perimeter = es.i+es.j+es.i+es.j;
                  ql.area = (int)round(s1+s2);
                  ql.sumdiag = diag+(int)round(c1);
                  quadrilateral q;
                  q.a=es.i;q.b=es.i;q.c=es.j;q.d=es.j;
                  q.diagonal = diag;
                  put_result(result, ql, q);
                }
             }
             if(es.i==es.j)continue;
             if(es.i==es.j)continue;
             double c2 = get_c(es.j, es.i, A2+B1);
             if(fabs(c2-round(c2))<MAX_ERR){//found one result
                int d2=(int)round(c2);
                if(d2<es.j+es.i&&d2<es.i+es.j){
                  resultql ql;
                  ql.perimeter = es.i+es.j+es.i+es.j;
                  ql.area = (int)round(s1+s2);
                  ql.sumdiag = diag+(int)round(c2);
                  quadrilateral q;
                  q.a=es.j;q.b=es.i;q.c=es.j;q.d=es.i;
                  q.diagonal = diag;
                  put_result(result, ql, q);
                }
             }
         }
   }
}

int main()
{
   int i;
   result_map map;
   for(i=3;i<=MAX_DIAG;i++){
         list_result_map(i,map);
   }
   return 0;
}

mathe 发表于 2017-5-1 10:01:39

不过找三个满足条件的四边形还是困难的,我的程序我把对角线长放大到5000也没有找到

hujunhua 发表于 2017-5-1 13:50:01

我不太喜欢这种对称破缺的东东。看到这个题目,我宁愿替换成寻找两个“三组对边之和对应相等的整数完全四点形”。

wayne 发表于 2017-5-1 14:12:07

:lol,对称破缺的话 基本上就进入程序员的领域了。 ,而非 纯数学所能解决的了
页: 1 [2] 3
查看完整版本: 最小的三同整数四边形对