吉大软件专硕967-2014

 

#include<math.h>
#include<stdbool.h>
/*C中没有bool类型,需要引入<stdbool.h>头文件*/
int main(){
	bool isPrime(int x);//声明 
	void Print(int n);
	int n;
	scanf("%d",&n);
	Print(n);
	return 0;
}
/*判断x是否为素数,是返回true,不是返回false*/
bool isPrime(int x){
	int i;
	bool is_prime=true;
	for(i=2;i<=sqrt(x);i++)
		if(x%i == 0){
			is_prime = false;
			break;
		}
	return is_prime;
}
void Print(int n){
	int i;
	for(i=2;i<=n/2;i++){
		if(isPrime(i)&&isPrime(n-i)){
			printf("%d=%d+%d\n",n,n-i,i);
			break;
		}
	}
} 


 

 

如果tanDA>=tanBA并且tanDA>=tanCA,则D一定不在三角形ADC内

同样tanDA<=tanBA并且tanDA<=tanCA,D也不在三角形内

同理tanDB、tanDC

只有当tanDA、tanDB、tanDC都夹在三角形中,则D在三角形内

#include<math.h>
#include<stdbool.h>
int main(){
	bool FindMax(double point[4][2]);
	int i;
	double point[4][2];
	for(i=0;i<4;i++){
		printf("请输入第%d个点的横坐标:",i+1);
		scanf("%lf",&point[i][0]);
		printf("请输入第%d个点的纵坐标:",i+1);
		scanf("%lf",&point[i][1]);
	}
	if(FindMax(point))
		printf("第四个点在前三个点构成的三角形内\n");
	else	
		printf("第四个点不在前三个点构成的三角形内\n");
	return 0;
}
bool FindMax(double point[4][2]){

	double tanD[3];
	double tan[3][2];
	int i,j,k;
	for(i=0;i<3;i++)
		tanD[i]=(point[3][1]-point[i][1])/(point[3][0]-point[i][0]);
	for(i=0;i<3;i++){
		k=0;
		for(j=0;j<3;j++)
			if(i!=j){
				tan[i][k]=(point[j][1]-point[i][1])/(point[j][0]-point[i][0]);
				k++;
			}
		if((tanD[i]>=tan[i][0]&&tanD[i]>=tan[i][1])||(tanD[i]<=tan[i][0]&&tanD[i]<=tan[i][1])){
			return false; 
		}
	}
	return true; 
}


 

 

 

方法类似于竖乘式,每次讲第二个数的每一位与第一个数相乘,将结果加入c数组中,并整理c中的数字进位情况

每次相乘也要进一位加入c

如:396*123:

第一次将3*396=1188加入c的[1][2][3][4]位,并整理,若c[i]位>10,则进位

第二次将2*396=738 加入c的[2][3][4]位,同上

同理循环,至全部相乘, 相加

//
//  main.c
//  Dong_test
//
//  Created by 神威 on 2018/3/13.
//  Copyright © 2018年 神威. All rights reserved.
//

#include<stdio.h>
#include<math.h>
#define N 100
#define M 200
int main(){
    int *multip(int *a,int *b,int *c);
    int a[N]={0,0,8,9,1,8,7,4,3,7};// 734781980 从a[1]开始存
    int b[N]={0,7,0,6,2,0,0,1,3,5};// 531002607
    int c[M]={0};
    int *C = multip(a, b,c);
    int i,j;
    for(j=M-1;j>0;j--)//找到不为0的第一位,从此为开始输出,并付给数组c
        if(c[j] != 0)
            break;
    
    for(i = j;i>0;i--){
        c[i] = C[i];
        printf("%d",c[i]);
    }
    printf("\n");
    return 0;
}
int *multip(int *a,int *b,int *c){
    int i,j,k,p,na,nb;
    /*计算a,b的位数*/
    for(na=N-1;na>0;na--){
        if(a[na] != 0)
            break;
    }
    for(nb=N-1;nb>0;nb--){
        if(b[nb] != 0)
            break;
    }
    c[0] = 0;
    for(i=1;i<=na;i++){//竖乘式方法计算, 并存在指针c中
        k = i;
        for(j=1;j<=nb;j++){
            c[k] = c[k]+a[i]*b[j];
            k++;
        }
        for(p=1;p<=k;p++){
            c[p+1]=c[p+1]+c[p]/10;
            c[p]=c[p]%10;
        }
    }
    return c;
}

运行结果:(改用Xcode编译器了,输出样子有些不同)

 

数学知识点:

设三点(x1,y1)(x2,y2)(x3,y3)

S面积=fabs(|y1-y3|*|x2-x1|/2+|x3-x1|*|y2-y3|/2-|x1-x3|*|y1-y3|/2)

先找出所有可能出现的3点组合,即找出所有点的 元素个数为3的全部子集 ,方法:二进制法

(二进制法:http://blog.csdn.net/qq_21149391/article/details/79405192 的第四题)

将每一组子集,用Area方法求出面积,并存放在area[M]中

求出数组area[M]中的最大值,就是面积的最大值。

本次随机生成5个点,方便观察,可改为N 100,生成100 个点

//
//  main.c
//  Dong_test
//
//  Created by 神威 on 2018/3/13.
//  Copyright © 2018年 神威. All rights reserved.
//

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define N 5 //随机生成的点 的个数
#define M 10
int main(){
    double Area(double Triangle[][2]);
    double MaxArea(double *a,int p);
    double subset(double point[][2]);
    double point[N][2];
    int i;
    srand(time(NULL));
    for(i=0;i<N;i++){//随机产生一些点的坐标
        point[i][0] = (double)(rand()%1000)/100;
        point[i][1] = (double)(rand()%1000)/100;
        printf("(%.2f,%.2f)\n",point[i][0],point[i][1]);
    }
    
    printf("最大的面积是:%.3f\n",subset(point));
    
}
double subset(double point[][2]){
    int i,j,k,n,p=0;
    int Binary[N]={0};
    double area[M]={0};
    double triangle[3][2];//三个点,每点x,y两个坐标
    /*求这些点的子集,子集内元素个数为3*/
    for(i=0;i<pow(2,N);i++){
        n=0;
        Binary[0]++;
        for(j=0;j<N;j++){
            Binary[j+1] += Binary[j] / 2;
            Binary[j] = Binary[j] % 2;
        }
        for(j=0;j<N;j++)
            if(Binary[j]==1)
                n++;
        if(n==3){
            k=0;
            for(j=0;j<N;j++){
                if(Binary[j]==1){
                    triangle[k][0] = point[j][0];
                    triangle[k][1] = point[j][1];
                    //printf("(%.2f,%.2f)\t",triangle[k][0],triangle[k][1]);
                    k++;
                }
            }
            area[p]=Area(triangle);
            
            p++;
        }
    }
    return MaxArea(area,p);
}
/*计算三点构成的面积*/
double Area(double Triangle[][2]){ //二维数组传参形式 ,第一个[]长度可省略,第二个不可省略
    double area=0;
    area=fabs(fabs(Triangle[0][1]-Triangle[2][1])*fabs(Triangle[1][0]-Triangle[0][0])/2+
              fabs(Triangle[2][0]-Triangle[0][0])*fabs(Triangle[1][1]-Triangle[2][1])/2-
              fabs(Triangle[0][0]-Triangle[2][0])*fabs(Triangle[0][1]-Triangle[2][1])/2);
    return area;
}
double MaxArea(double *a,int p){
    int i;
    double max=0;
    for(i=0;i<p;i++)
        if(a[i]>max)
            max = a[i];
    return  max;
}


 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Manigoldo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值