吉大軟體專碩967-2014
阿新 • • 發佈:2018-11-01
#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]位,同上
同理迴圈,至全部相乘, 相加
執行結果:(改用Xcode編譯器了,輸出樣子有些不同)// // 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; }
數學知識點:
設三點(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;
}