#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;
}