数学基础
1 cantor的数表
题目:现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 第一项是1/1,第二项是是1/2,第三项是2/1,第四项是3/1,第五项是2/2,……。输入n,输出第n项。
样例输入:
3
14
7
12345
样例输出:
2/1
2/4
1/4
59/99
- 简单法:
1 #include <stdio.h> 2 3 int main() { 4 int n,k,s; 5 while(scanf("%d",&n)!=EOF){ 6 s=0;k=1; 7 for(;;){ 8 s+=k; 9 if(s>=n){ 10 printf("%d/%d\n",s-n+1,k-s+n); 11 break; 12 } 13 k++; 14 } 15 } 16 return 0; 17 }
- 代数法:
1 #include <stdio.h> 2 #include<math.h> 3 int main() { 4 int n,k,s; 5 while(scanf("%d",&n)!=EOF){ 6 k=(int)floor((sqrt(8.0*n+1)-1)/2-1e-9)+1;//1e-9指1x10^(-9) 7 s=k*(k+1)/2; 8 printf("%d/%d\n",s-n+1,k-s+n); 9 } 10 return 0; 11 }
2 因子和阶乘
题目:输入正整数n(2<=n<=100),把阶乘n!分解成素因子相乘的形式从小都大输出各个素数(2、3、5、。。。)的指数、
输入:
5
53
输出:
5!= 5 2 1
53!= 53 26 17 10 7 4 4 3 2 2 1 1 1 1 1 1
1 #include <stdio.h> 2 #include<string.h> 3 //判断是否为素数 4 int is_prime(int n){ 5 for(int i=2;i*i<=n;i++){ 6 if(n%i==0) return 0; 7 } 8 return 1; 9 } 10 //素数表 11 int prime[100],count=0; 12 int main() { 13 int p[100],n; 14 int i,j; 15 for(i=1;i<100;i++){ 16 if(is_prime(i)) prime[count++]=i; 17 } 18 while(scanf("%d",&n)!=EOF){ 19 printf("%d!=",n); 20 int maxp=0; 21 memset(p,0,sizeof(p)); 22 //因为是阶乘,所以用循环把每一个值得素数找出来 23 for(i=1;i<=n;i++){ 24 int m=i; 25 for(j=0;j<count;j++){ 26 if(m%prime[j]==0){ 27 m/=prime[j]; 28 p[j]++; 29 if(j>maxp) maxp=j; 30 } 31 } 32 } 33 //maxp就是用来输出到最大的素数值。 34 for(i=0;i<maxp;i++){ 35 printf(" %d",p[i]); 36 } 37 printf("\n"); 38 } 39 return 0; 40 }
3 果园里的树
题目:果园里的树排列成举证。它们的x和y坐标均是1~99的整数。输入若干个三角形,一次统计每一个三角形内部和边界上共有多少果树。
样例输入:
1.5 1.5 1.5 6.8 6.8 1.5
10.7 6.9 8.5 1.5 14.5 1.5
样例输出:
15
17
嗯。应该算是小问题,勉勉强强把一题做完,以后剂量独立做,自己找问题很重要!
1 #include <stdio.h> 2 #include<math.h> 3 double area2(double x0,double y0,double x1,double y1,double x2,double y2){ 4 return x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0; 5 } 6 int main() { 7 double x0,y0,x1,y1,x2,y2; 8 int i,j,count; 9 while(scanf("%lf%lf%lf%lf%lf%lf",&x0,&y0,&x1,&y1,&x2,&y2)!=EOF){ 10 count=0; 11 double s1,s2,s3,s4,s; 12 s1=fabs(area2(x0,y0,x1,y1,x2,y2)); 13 for(i=1;i<=99;i++){ 14 for(j=1;j<=99;j++){ 15 s2=fabs(area2(x0,y0,x1,y1,i*1.0,j*1.0)); 16 s3=fabs(area2(x0,y0,x2,y2,i*1.0,j*1.0)); 17 s4=fabs(area2(x1,y1,x2,y2,i,j*1.0)); 18 if(fabs(s1-s2-s3-s4)<1e-9) count++; 19 } 20 } 21 printf("%d\n",count); 22 } 23 return 0; 24 }
4 多少块土地
题目:你有一块椭圆的地。你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段。它们最多能把土地分成多少部分。
输入:
4
输出:
8
欧拉公式:V-E+F=2。其中,V是定点数(即所有线段的端点数加上交点数),
E是边数(即n段椭圆弧加上这些线段被切成的段数),
F是面数(即土地块数加上椭圆外那个无穷大的面)。
友情连接:知乎上欧拉公式
搞事情,最后面又说,嗯,只需求出V和E,答案就是E-V+1。数学家的思想啊。。。但是,忽略了要去掉无强大的面,秒杀。
1 #include <stdio.h> 2 int f(int x,int n){ 3 return x*(n-2-x); 4 } 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 int v,e,i; 10 int a=0,b=0; 11 if(n==1) printf("1"); 12 else{ 13 for(i=0;i<=n-2;i++){ 14 a+=f(i,n); 15 b+=f(i,n)+1; 16 } 17 v=n+n/4*a; 18 e=n+n/2*b; 19 // printf("%d%d",v,n); 20 printf("%d",e-v+1); 21 } 22 return 0; 23 }