高级语言讲义2018计专(仅高级语言部分)

本文介绍了如何使用编程解决中国古代数学问题(如百鸡问题),递归函数实现阶乘和特定公式计算,验证卡布列卡猜想的过程,以及计算由给定点构成三角形的最大面积。
摘要由CSDN通过智能技术生成

1.编写完整程序解决中国古代数学家张丘健在他的《算经》中提出的”百钱百鸡问题“:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁,母,雏各几何

#include <stdio.h>

void cal() {
	for(int i=0; i<=20; i++)
		for(int j=0; j<=33; j++)
			for(int k=0; k<=300; k++)
				if((5*i+3*j+k*1.0/3==100)&&(i+j+k==100)) {
					printf("%d %d %d",i,j,k);
					printf("\n");
				}
}

int main() {
	cal();
}

2.编写一个递归函数,实现如下公式的计算功能,其中n为自然数

f(n)=0/(1*2!)+1/(2*3!)+2/(3*4!)+....+n/((n+1)*(n+2)!)

#include <stdio.h>

int fac(int n) {
	if(n==0)
		return 1;
	return fac(n-1)*n;
}

int func(int n) {
	if(n==0)
		return 0;
	return func(n-1)+n/((n+1)*fac(n+2));
}

3.验证卡布列卡猜想。印度数学家卡布列卡在研究数学问题时发现一个有趣的现象:用不完全相同的四个数字组成一个四位数,将组成这个四位数的四个数字重新排序,组成一个最大的数和一个最小的数,并用较大的数减去较小的数,对减得的差再重复上述操作,若减得的差不够四位数, 用零补位(可以在任何位置补位),不断地做下去,最后变成一个固定不变的数:6174。卡布列卡普做过大量的试验,结果从任何满足条件的四位数开始,最后总能变成6174,因此,卡布列卡把6174叫做布列卡常数。例如,我们从4231开始,首先把4231重新排列成4321和1234,两数相减得3087;再把3087重新排列成8730和0378,两数相减得8352;再把8352重新排列成8532和2358。相减得6174;再把6174重新排列成7641和1467。两数相减得6174。编写一个完整程序,用输入的任意一个由不完全相同的四个数字组成的四位数验证卡布列卡猜想,并把验证猜想过程的每步计 算结果打印出来。

#include <stdio.h>
#define N 4

int getmax(int *arr) {
	sort(arr,0);
	int flag=0;
	for(int i=0; i<N; i++)
		flag+=arr[i]*pow(10,N-1-i);
	return flag;
}

int getmin(int *arr) {
	sort(arr,1);
	int flag=0;
	for(int i=0; i<N; i++)
		flag+=arr[i]*pow(10,N-1-i);
	return flag;
}

void sort(int *arr,int flag) {
	for(int i=0; i<N-1; i++)
		for(int j=0; j<N-i-1; j++)
			if(flag==1) {
				if(arr[j]>arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			} else {
				if(arr[j]<arr[j+1]) {
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;

				}
			}
}

int *getarr(int *arr,int n) {
	for(int i=0; i<N; i++) {
		arr[N-1-i]=n%10;
		n/=10;
	}
}

int main() {
	int n;
	scanf("%d",&n);
	int arr[N];
	getarr(arr,n);
	int max = getmax(arr);
	int min = getmin(arr);
	int flag = max-min;
	printf("max=%d\nmin=%d\nflag=%d\n",max,min,flag);
	while(flag!=6174) {
		getarr(arr,flag);
		max = getmax(arr);
		min = getmin(arr);
		flag=max-min;
		printf("max=%d\nmin=%d\nflag=%d\n",max,min,flag);
	}
}

4.已知数组ax[100]和ay[100]中分别保存了平面上100个点的横坐标和纵坐标,假定其中任意三个点均可以构成三角形,编写一段代码,求100个点组成的所有三角形中面积最大三角形以及面积,输出面积最大的三角形的各顶点坐标以及面积值,满足条件的面积可能有多组。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

typedef struct Point {
	double x,y;
} Point;

double dist(struct Point p1,struct Point p2) {
	return sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2));
}

double area(struct Point p1,struct Point p2,struct Point p3) {
	double a,b,c;
	a=dist(p1,p2);
	b=dist(p1,p3);
	c=dist(p2,p3);
	double s=(a+b+c)/2.0;
	return sqrt(s*(s-a)*(s-b)*(s-c));
}

int main() {
	struct Point pts[110];
	double max=-1;
	for(int i=0; i<100; i++)
		scanf("%lf %lf",&pts[i].x,&pts[i].y);
	max=area(pts[0],pts[1],pts[2]);
	struct Point maxpoint[3];
	for(int flag=0; flag<3; flag++)
		maxpoint[flag]=pts[flag];
	for(int i=0; i<100; i++)
		for(int j=i+1; j<100; j++)
			for(int k=j+1; k<100; k++)
				if(max<area(pts[i],pts[j],pts[k])) {
					max=area(pts[i],pts[j],pts[k]);
					maxpoint[0]=pts[i];
					maxpoint[1]=pts[j];
					maxpoint[2]=pts[k];
				}
	for(int flag=0; flag<3; flag++)
		printf("x=%lf y=%lf\n",maxpoint[flag].x,maxpoint[flag].y);
	printf("maxarea = %lf",max);
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值