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为自然数
#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);
}