1. 程式人生 > >吉大軟體專碩967-2014

吉大軟體專碩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;
}