基础题目选解_数学基础

数学基础

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 }

 

转载于:https://www.cnblogs.com/JanFangZ/p/7276838.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值