| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 392 人关注过本帖
标题:一个数学问题
只看楼主 加入收藏
miss_you
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-10-23
结帖率:0
收藏
已结贴  问题点数:10 回复次数:3 
一个数学问题
“给定一个凸N边形,满足性质:任何三条对角线都不交于同一点。在这样一个多边形的内部,它的所有对角线共形成多少个交点呢?


我的算法是:给N边形N个点从1到N编号,先确定第一个点,再确定第二个点(和第一个点不重合也不相邻),这样这两点构成一条直线,再确定第三个点(不和前两个点重合),再确定第四个点(不和前三点重合且不和第三点相邻),这样第三和第四个点又能构成一条直线,两条直线确定一个交点。可是编的程序除了输入N为1时输出0外,输入其它的数都没有结果输出,请问这是为什么啊?还有我的算法可行吗?


我的程序是:

#include <stdio.h>
#include <math.h>
int main()
{
    int i,j,p,k,n;   /* i,j,p,k分别为第一个,第二个,第三个,第四个点*/
    unsigned long x=0;/* x用来计算交点个数*/
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            if((i==1&&j==n)||(i=n&&j==1))/*挖去这种"特殊"的相邻的情况,下同*/
                continue;
            if(fabs(i-j)<=1)         /*挖去相邻和重合的情况*/
                continue;
            for(p=1;p<=n;p++)
            {
                if(p==i||p==j)       /*挖去第三点和前两点重合的情况*/
                    continue;
                for(k=1;k<=n;k++)
                {
                    if(k==i||k==j)   /*挖去第四点和前两点重合的情况*/
                        continue;
                    if(fabs(p-k)<=1)
                        continue;    /*挖去第四点和第三点重合或相邻的情况*/
                    if((k==1&&p==n)||(k==n&&p==1))  /*挖去第三和第四点相邻的情况*/
                        continue;
                    x++;          /*如果能执行到这步就可以构成交点,所以x加1*/
                }
            }
        }
     printf("%ld",x/8);       /*按这种算法同一个交点重复算了8次*/
     return 0;
}


[ 本帖最后由 miss_you 于 2009-11-13 22:52 编辑 ]
搜索更多相关主题的帖子: 数学 
2009-11-13 22:50
仰望者
Rank: 2
等 级:论坛游民
帖 子:57
专家分:86
注 册:2009-11-6
收藏
得分:10 
凸N边形的对角线条数为:n(n-3)/2
因为每一个交点对应两条对角线,而两条对角线又对应着一个四边形。于是焦点个数就对应四边形的个数。问题转化成由凸n边形的n个顶点取4个顶点可组成多少个四边形的问题,故最多共有n(n-1)(n-2)(n-3)/24个交点。
故程序课编为:
#include "stdio.h"
int s,n;
int main()
{
printf("please input n:\0");
scanf("%d",&n);
s=n*(n-1)*(n-2)*(n-3)/24;
printf("%d",s);
getch();
}
2009-11-14 00:41
仰望者
Rank: 2
等 级:论坛游民
帖 子:57
专家分:86
注 册:2009-11-6
收藏
得分:0 
额,忘了补充n是应该大于3的。。。。
2009-11-14 00:44
仰望者
Rank: 2
等 级:论坛游民
帖 子:57
专家分:86
注 册:2009-11-6
收藏
得分:0 
终于看懂楼主是思路了,其实楼主就是为了找4个不同的点,每4个不同点够成1个交点,所以根本不用那么麻烦只需先在n点中找1点,再在剩下的n-1点中找第二点,第三点在n-2中找,第四点在n-3中找,所以只要4个叠加的循环就好了。。。
#include <stdio.h>
int main()
{
  int i,j,p,k,x=0,n;
   scanf("%d",&n);
    for(i=1;i<=n;i++)
       for(j=1;j<=n-1;j++)
          for(p=1;p<=n-2;p++)
             for(k=1;k<=n-3;k++)
             x++;
     printf("%d",x/24);
     getch();
     return 0;
}
从楼主的思路(程序)中,我个人感觉楼主受数组影响太大,把点编了号,试图把所有点(位置)都把握住,其实没必要。还有,最后除的是24,而不是8.
24为for(i=1;i<=4;i++)
       for(j=1;j<=3;j++)
          for(p=1;p<=2;p++)
             for(k=1;k=1;k++)
             x++;
说白了就是排列组合问题,正如标题所说的-----一个数学问题。。。别想太复杂了。。。。
2009-11-14 01:45
快速回复:一个数学问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015967 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved