• 第七届蓝桥杯个人赛省赛--C语言B组


    题目一

    煤球数目

    有一堆煤球,堆成三角棱锥形。具体:
    第一层放1个,
    第二层3个(排列成三角形),
    第三层6个(排列成三角形),
    第四层10个(排列成三角形),
    ....
    如果一共有100层,共有多少个煤球?

    请填表示煤球总数目的数字。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

    答案:171700

    解析:

    方法一:数学方法

    方法二:暴力循环

               易知每一层的数目都是上一层煤球数加上这一层的层数,代码如下:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int i=0,sum=0,num=0;
     8     //sum是煤球总数,num是当前层煤球数
     9     for(i=1;i<=100;i++)
    10     {
    11         num+=i;
    12         sum+=num;
    13     }
    14     printf("%d
    ",sum);
    15     return 0;
    16 }

     题目二


    生日蜡烛

    某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

    现在算起来,他一共吹熄了236根蜡烛。

    请问,他从多少岁开始过生日party的?

    请填写他开始过生日party的年龄数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

     答案:26

    解析:

    暴力枚举,代码如下:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int i,j,num;
     8     //设某君从i岁开始过生日,现在j岁
     9     //num是吹灭掉蜡烛数
    10     for(i=0;i<200;i++)
    11     {
    12         for(j=0;j<200;j++)
    13         {
    14             num=(i+j)*(j-i+1)/2;
    15             if(num==236)
    16             {
    17                 printf("%d
    ",i);
    18                 break;
    19             }
    20         }
    21     }
    22     return 0;
    23 }

     题目三


    凑算式




    这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

    比如:
    6+8/3+952/714 就是一种解法,
    5+3/1+972/486 是另一种解法。

    这个算式一共有多少种解法?

    注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

    答案:29

    解析:

    方法一:递归法/DFS法,请自行百度

    方法二:暴力枚举,注意每个字母代表的数字都不一样。代码如下:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int a[9];//a[0]~a[8]代表A-I
     8     int sum=0;
     9     double num=0;
    10     for(a[0]=1;a[0]<=9;a[0]++)
    11     {
    12         for(a[1]=1;a[1]<=9;a[1]++)
    13         {
    14             if(a[1]==a[0])
    15                 continue;
    16             for(a[2]=1;a[2]<=9;a[2]++)
    17             {
    18                 if(a[2]==a[1]||a[2]==a[0])
    19                     continue;
    20                 for(a[3]=1;a[3]<=9;a[3]++)
    21                 {
    22                     if(a[3]==a[2]||a[3]==a[1]||a[3]==a[0])
    23                         continue;
    24                     for(a[4]=1;a[4]<=9;a[4]++)
    25                     {
    26                         if(a[4]==a[3]||a[4]==a[2]||a[4]==a[1]||a[4]==a[0])
    27                             continue;
    28                         for(a[5]=1;a[5]<=9;a[5]++)
    29                         {
    30                             if(a[5]==a[4]||a[5]==a[3]||a[5]==a[2]||a[5]==a[1]||a[5]==a[0])
    31                                 continue;
    32                             for(a[6]=1;a[6]<=9;a[6]++)
    33                             {
    34                                 if(a[6]==a[5]||a[6]==a[4]||a[6]==a[3]||a[6]==a[2]||a[6]==a[1]||a[6]==a[0])
    35                                     continue;
    36                                 for(a[7]=1;a[7]<=9;a[7]++)
    37                                 {
    38                                     if(a[7]==a[6]||a[7]==a[5]||a[7]==a[4]||a[7]==a[3]||a[7]==a[2]||a[7]==a[1]||a[7]==a[0])
    39                                         continue;
    40                                     for(a[8]=1;a[8]<=9;a[8]++)
    41                                     {
    42                                         if(a[8]==a[7]||a[8]==a[6]||a[8]==a[5]||a[8]==a[4]||a[8]==a[3]||a[8]==a[2]||a[8]==a[1]||a[8]==a[0])
    43                                             continue;
    44                                         num=(double)a[0]+(double)a[1]/a[2]+(double)(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]);
    45                                         if(num==10.0)
    46                                         {
    47                                             sum++;
    48                                         }
    49                                     }
    50                                 }
    51                             }
    52                         }
    53                     }
    54                 }
    55             }
    56         }
    57     }
    58     printf("%d
    ",sum);
    59     return 0;
    60 }

     题目四


    快速排序

    排序在各种场合经常被用到。
    快速排序是十分常用的高效率的算法。

    其思想是:先选一个“标尺”,
    用它把整个队列过一遍筛子,
    以保证:其左边的元素都不大于它,其右边的元素都不小于它。

    这样,排序问题就被分割为两个子区间。
    再分别对子区间排序就可以了。

    下面的代码是一种实现,请分析并填写划线部分缺少的代码。

     1 #include <stdio.h>
     2 
     3 void swap(int a[], int i, int j)
     4 {
     5     int t = a[i];
     6     a[i] = a[j];
     7     a[j] = t;
     8 }
     9 
    10 int partition(int a[], int p, int r)
    11 {
    12     int i = p;
    13     int j = r + 1;
    14     int x = a[p];
    15     while(1){
    16         while(i<r && a[++i]<x);
    17         while(a[--j]>x);
    18         if(i>=j) break;
    19         swap(a,i,j);
    20     }
    21     ______________________;
    22     return j;
    23 }
    24 
    25 void quicksort(int a[], int p, int r)
    26 {
    27     if(p<r){
    28         int q = partition(a,p,r);
    29         quicksort(a,p,q-1);
    30         quicksort(a,q+1,r);
    31     }
    32 }
    33     
    34 int main()
    35 {
    36     int i;
    37     int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
    38     int N = 12;
    39     
    40     quicksort(a, 0, N-1);
    41     
    42     for(i=0; i<N; i++) printf("%d ", a[i]);
    43     printf("
    ");
    44     
    45     return 0;
    46 }

    注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

    答案:swap(a,p,j)

    可验证的完整代码如下:

     1 #include <stdio.h>
     2 
     3 void swap(int a[], int i, int j)
     4 {
     5     int t = a[i];
     6     a[i] = a[j];
     7     a[j] = t;
     8 }
     9 
    10 int partition(int a[], int p, int r)
    11 {
    12     int i = p;
    13     int j = r + 1;
    14     int x = a[p];
    15     while(1){
    16         while(i<r && a[++i]<x);
    17         while(a[--j]>x);
    18         if(i>=j) break;
    19         swap(a,i,j);
    20     }
    21     //______________________;
    22     swap(a,p,j);
    23     return j;
    24 }
    25 
    26 void quicksort(int a[], int p, int r)
    27 {
    28     if(p<r){
    29         int q = partition(a,p,r);
    30         quicksort(a,p,q-1);
    31         quicksort(a,q+1,r);
    32     }
    33 }
    34     
    35 int main()
    36 {
    37     int i;
    38     int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
    39     int N = 12;
    40     
    41     quicksort(a, 0, N-1);
    42     
    43     for(i=0; i<N; i++) printf("%d ", a[i]);
    44     printf("
    ");
    45     
    46     return 0;
    47 }

    题目五


    抽签

    X星球要派出一个5人组成的观察团前往W星。
    其中:
    A国最多可以派出4人。
    B国最多可以派出2人。
    C国最多可以派出2人。
    ....

    那么最终派往W星的观察团会有多少种国别的不同组合呢?

    下面的程序解决了这个问题。
    数组a[] 中既是每个国家可以派出的最多的名额。
    程序执行结果为:
    DEFFF
    CEFFF
    CDFFF
    CDEFF
    CCFFF
    CCEFF
    CCDFF
    CCDEF
    BEFFF
    BDFFF
    BDEFF
    BCFFF
    BCEFF
    BCDFF
    BCDEF
    ....
    (以下省略,总共101行)

     1 #include <stdio.h>
     2 #define N 6
     3 #define M 5
     4 #define BUF 1024
     5 
     6 void f(int a[], int k, int m, char b[])
     7 {
     8     int i,j;
     9     
    10     if(k==N){ 
    11         b[M] = 0;
    12         if(m==0) printf("%s
    ",b);
    13         return;
    14     }
    15     
    16     for(i=0; i<=a[k]; i++){
    17         for(j=0; j<i; j++) b[M-m+j] = k+'A';
    18         ______________________;  //填空位置
    19     }
    20 }
    21 int main()
    22 {    
    23     int  a[N] = {4,2,2,1,1,3};
    24     char b[BUF];
    25     f(a,0,M,b);
    26     return 0;
    27 }

    仔细阅读代码,填写划线部分缺少的内容。

    注意:不要填写任何已有内容或说明性文字。

    答案:f(a,k+1,m-i,b)  或者 f(a,k+1,m-j,b)

    代码填空题完成后代入完整程序进行验证是最好的检验方法。

    可验证的完整代码如下:

     1 #include <stdio.h>
     2 #define N 6
     3 #define M 5
     4 #define BUF 1024
     5 
     6 void f(int a[], int k, int m, char b[])
     7 {
     8     int i,j;
     9     
    10     if(k==N){ 
    11         b[M] = 0;
    12         if(m==0) printf("%s
    ",b);
    13         return;
    14     }
    15     
    16     for(i=0; i<=a[k]; i++){
    17         for(j=0; j<i; j++) b[M-m+j] = k+'A';
    18         f(a,k+1,m-i,b) ;  //填空位置
    19     }
    20 }
    21 int main()
    22 {    
    23     int  a[N] = {4,2,2,1,1,3};
    24     char b[BUF];
    25     f(a,0,M,b);
    26     return 0;
    27 }

     题目六


    方格填数

    如下的10个格子

    填入0~9的数字。要求:连续的两个数字不能相邻。
    (左右、上下、对角都算相邻)

    一共有多少种可能的填数方案?

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

     答案:1580

    解析:http://www.cnblogs.com/xiangguoguo/p/5339605.html

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 int count=0;
      4 int take[10],index=0;//记录当前已经填入的数字,用于填数字前判断是否已经使用,避免重复使用 
      5 int is_legal(int s[3][4])//判断是否满足要求:相邻位置数字不能相邻,就是两数字的差大于1.就是为什么s[0][0]、s[2][3]置为-2;
      6 {
      7     //这里的判断方法有点死板。假设每个位置都有上下左右和对角,只需要判断这些位置
      8     //是不是在数组中,在就进行比较,不在就说明没有。 
      9     for(int i=0;i<3;i++)
     10     {
     11         for(int j=0;j<4;j++)
     12         {
     13             if(j-1>=0)
     14             {
     15                 if(abs(s[i][j]-s[i][j-1])==1)
     16                 {
     17                     return 0;
     18                 }
     19             }
     20             if(j+1<4)
     21             {
     22                 if(abs(s[i][j]-s[i][j+1])==1)
     23                 {
     24                     return 0;
     25                 }
     26             }
     27             if(i+1<3)
     28             {
     29                 if(abs(s[i][j]-s[i+1][j])==1)
     30                 {
     31                     return 0;
     32                 }
     33             }
     34             if(j-1>=0&&i+1<3)
     35             {
     36                 if(abs(s[i][j]-s[i+1][j-1])==1)
     37                 {
     38                     return 0;
     39                 }
     40             }
     41             if(j+1<4&&i+1<3)
     42             {
     43                 if(abs(s[i][j]-s[i+1][j+1])==1)
     44                 {
     45                     return 0;
     46                 }
     47             }
     48             if(i-1>=0&&j+1<4)
     49             {
     50                 if(abs(s[i][j]-s[i-1][j+1])==1)
     51                 {
     52                     return 0;
     53                 }
     54             }
     55             if(i-1>=0)
     56             {
     57                 if(abs(s[i][j]-s[i-1][j])==1)
     58                 {
     59                     return 0;
     60                 }
     61             }
     62             if(j-1>=0&&i-1>=0)
     63             {
     64                 if(abs(s[i][j]-s[i-1][j-1])==1)
     65                 {
     66                     return 0;
     67                 }
     68             }
     69         }
     70     } 
     71     return 1;
     72 }
     73 void fun(int s[3][4],int a,int b)
     74 {
     75     int i;
     76     if(a==2&&b==3)//表示当前已经填满了表格,需要进行判断看是否满足要求 
     77     {
     78         if(is_legal(s))
     79         {
     80             count++;
     81         }
     82     }
     83     else//继续填写 
     84     {
     85         for(i=0;i<=9;i++)
     86         {
     87             int j;
     88             for(j=0;j<index;j++)//填写的数字必须是没有用过的 
     89             {
     90                 if(i==take[j])
     91                 {
     92                     break;
     93                 }
     94             }
     95             if(j==index)
     96             {
     97                 s[a][b]=i;
     98                 take[index++]=i;
     99                 if(b<3)//表示当前行还没填完 
    100                 {
    101                     fun(s,a,b+1);
    102                 }
    103                 else//当前行填完就从下一行开始 
    104                 {
    105                     if(a<2)//判断当前行是否是最后一行 
    106                     {
    107                         fun(s,a+1,0);
    108                     }
    109                 }
    110                 index--;//在一次填满结束后,当前位置的数字换为其他可以填写的数字
    111                         //所以当前使用的数字需要出去。 
    112             }
    113         } 
    114     }
    115 }
    116 int main()
    117 {
    118     int s[3][4];
    119     s[0][0]=-2;
    120     s[2][3]=-2;
    121     //左上角和右下角没有,为了方便判断把数值设为-2(小于-1大于10均可) 
    122     fun(s,0,1);
    123     printf("%d
    ",count);
    124     return 0;
    125 }

     题目七


    剪邮票

    如【图1.jpg】, 有12张连在一起的12生肖的邮票。
    现在你要从中剪下5张来,要求必须是连着的。
    (仅仅连接一个角不算相连)
    比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

    请你计算,一共有多少种不同的剪取方法。

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

     答案:116

    解析:http://www.cnblogs.com/program-ccc/p/5321243.html

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int a[3][4]={
     5     {0,1,2,3},
     6     {4,5,6,7},
     7     {8,9,10,11}};//为了方便,均执行-1操作
     8 int vec[15];
     9 int res;
    10 int dx[4]={1,0,-1,0};
    11 int dy[4]={0,1,0,-1};
    12 int vis[5][5];
    13 bool Include(int x)
    14 {
    15     for(int i=0;i<5;i++)
    16         if(vec[i]==x)    return true;
    17     return false;
    18 }
    19 void Connect(int y,int x)
    20 {
    21     for(int i=0;i<4;i++)
    22     {
    23         int ny=dy[i]+y;
    24         int nx=dx[i]+x;
    25         if(0<=ny&&ny<3&&0<=nx&&nx<4&&!vis[ny][nx]&&Include(a[ny][nx]))
    26         {
    27                 vis[ny][nx]=1;
    28                 Connect(ny,nx);
    29         }
    30     }
    31 }
    32 void dfs(int i,int j)
    33 {
    34     if(i==12)
    35     {
    36         if(j==5)
    37         {
    38             memset(vis,0,sizeof(vis));
    39             int y=vec[0]/4,x=vec[0]%4;
    40             vis[y][x]=1;
    41             Connect(y,x);
    42             int mark=0;
    43             for(int k=0;k<j;k++)
    44             {
    45                 y=vec[k]/4;
    46                 x=vec[k]%4;
    47                 if(vis[y][x]==1)        
    48                     mark++;
    49             }
    50             if(mark==5)    res++;
    51         }
    52         return ;
    53     }
    54     vec[j]=*(a[0]+i);
    55     dfs(i+1,j+1);
    56     vec[j]=0;
    57     dfs(i+1,j);
    58 }
    59 
    60 int main()
    61 {
    62     res=0;
    63     dfs(0,0);
    64     printf("%d
    ",res);
    65     return 0;
    66 }

      题目八

     


    四平方和

     

    四平方和定理,又称为拉格朗日定理:
    每个正整数都可以表示为至多4个正整数的平方和。
    如果把0包括进去,就正好可以表示为4个数的平方和。

     

    比如:
    5 = 0^2 + 0^2 + 1^2 + 2^2
    7 = 1^2 + 1^2 + 1^2 + 2^2
    (^符号表示乘方的意思)

     

    对于一个给定的正整数,可能存在多种平方和的表示法。
    要求你对4个数排序:
    0 <= a <= b <= c <= d
    并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

     


    程序输入为一个正整数N (N<5000000)
    要求输出4个非负整数,按从小到大排序,中间用空格分开

     

    例如,输入:
    5
    则程序应该输出:
    0 0 1 2

     

    再例如,输入:
    12
    则程序应该输出:
    0 2 2 2

     

    再例如,输入:
    773535
    则程序应该输出:
    1 1 267 838

     

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗  < 3000ms

     

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

     

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

     

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

     

    提交时,注意选择所期望的编译器类型。

    解析:http://blog.csdn.net/luoluozlb/article/details/51339287

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 int main()
     5 {
     6     int a, b, c, n, flag = 0;
     7     double maxN, d;
     8     scanf("%d", &n);
     9     maxN = sqrt((double)n);
    10 
    11     for(a = 0; a <= maxN; a ++){
    12         for(b = a; b <= maxN; b ++){
    13             for(c = b; c <= maxN; c ++){
    14                 d = sqrt((double)(n - a*a - b*b - c*c));
    15                 if(d == (int)d){
    16                     printf("%d %d %d %d
    ", a, b, c, (int)d);
    17                     flag = 1;
    18                     break;
    19                 }
    20             }
    21             if(flag)
    22                 break;
    23         }
    24         if(flag)
    25             break;
    26     }
    27     return 0;
    28 }

    题目九

     


    交换瓶子

     

    有N个瓶子,编号 1 ~ N,放在架子上。

     

    比如有5个瓶子:
    2 1 3 5 4

     

    要求每次拿起2个瓶子,交换它们的位置。
    经过若干次后,使得瓶子的序号为:
    1 2 3 4 5

     

    对于这么简单的情况,显然,至少需要交换2次就可以复位。

     

    如果瓶子更多呢?你可以通过编程来解决。

     

    输入格式为两行:
    第一行: 一个正整数N(N<10000), 表示瓶子的数目
    第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

     

    输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

     

    例如,输入:
    5
    3 1 2 5 4

     

    程序应该输出:
    3

     

    再例如,输入:
    5
    5 4 3 2 1

     

    程序应该输出:
    2

     

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗  < 1000ms

     

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

     

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

     

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

     

    提交时,注意选择所期望的编译器类型。

     

     解析:http://blog.csdn.net/luoluozlb/article/details/51339307

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 int main()
     5 {
     6     int arr[10010];        //记录第i个瓶子编号为多少
     7     int flag[10010];    //记录编号为i的瓶子在哪儿
     8     int ans = 0;
     9     int n,i;
    10     scanf("%d",&n);
    11 
    12     for(i = 1 ; i <= n ; i ++)
    13         scanf("%d",&arr[i]);
    14         
    15     for(i = 1 ; i <= n ; i ++ )
    16         flag[arr[i]] = i;
    17     
    18     for(i = 1 ; i <= n ; i ++)
    19     {
    20         if( i != arr[i] )
    21         {
    22             int x = arr[i];
    23             arr[i] ^= arr[flag[i]] ^= arr[i] ^= arr[flag[i]];
    24             flag[i] ^= flag[x] ^= flag[i] ^= flag[x];
    25             ans ++;
    26         }  
    27     }
    28     
    29     printf("%d
    ",ans);
    30     return 0;
    31 }

     

    题目十


    最大比例

    X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
    并且,相邻的两个级别间的比例是个固定值。
    也就是说:所有级别的奖金数构成了一个等比数列。比如:
    16,24,36,54
    其等比值为:3/2

    现在,我们随机调查了一些获奖者的奖金数。
    请你据此推算可能的最大的等比值。

    输入格式:
    第一行为数字 N (0<N<100),表示接下的一行包含N个正整数
    第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额

    要求输出:
    一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数

    测试数据保证了输入格式正确,并且最大比例是存在的。

    例如,输入:
    3
    1250 200 32

    程序应该输出:
    25/4

    再例如,输入:
    4
    3125 32 32 200

    程序应该输出:
    5/2

    再例如,输入:
    3
    549755813888 524288 2

    程序应该输出:
    4/1

    资源约定:
    峰值内存消耗 < 256M
    CPU消耗  < 3000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

    注意: main函数需要返回0
    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
    注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

    提交时,注意选择所期望的编译器类型。

    解析:http://www.aichengxu.com/cyvyan/6607933.htm

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 long long int a[100],p1[100],p2[100];
     7 
     8 long long int gcd(long long int a,long long int b)
     9 {
    10     long long int t;
    11     while(t=a%b)
    12     {
    13         a=b;
    14         b=t;
    15     }
    16     return b;
    17 }
    18 
    19 int main()
    20 {
    21     int n;
    22     cin>>n;
    23 
    24     memset(a,0,sizeof(a));
    25     for(int i=0; i<n; i++)
    26     {
    27         cin>>a[i];
    28     }
    29     sort(a,a+n);//从小到大排序
    30     int k=1;
    31     for(int i=1; i<n; i++)//去掉重复的数字
    32     {
    33         if(a[i]!=a[i-1])
    34             a[k++]=a[i];
    35     }
    36     n=k;
    37     if(n==1)//如果只剩下一个数字,则公比为1/1
    38     {
    39         cout<<"1/1"<<endl;
    40         return 0;
    41     }
    42     else if(n==2)//如果剩下两个数字,则公比为两者的商,利用最大公约数求商
    43     {
    44         long long int g=gcd(a[n-1],a[n-2]);
    45         cout<<a[n-1]/g<<"/"<<a[n-2]/g<<endl;
    46     }
    47     else if(n>2)
    48     {
    49         k=0;
    50         long long int g,g1,g2;
    51         for(int i=1; i<n; i++)//分别求出后一项与前一项的比值
    52         {
    53             g=gcd(a[i],a[i-1]);
    54             p1[k]=a[i]/g;
    55             p2[k]=a[i-1]/g;
    56             k++;
    57         }
    58         double t=999999;
    59         long long int t1,t2,tt1,tt2;
    60 
    61         for(int i=0; i<k; i++)//遍历每一个比值,用大的除以小的,找出最小的公比
    62             for(int j=i+1; j<k; j++)
    63             {
    64 
    65                 if(p1[i]*p2[j]>p1[j]*p2[i])
    66                 {
    67                     t1=p1[i]/p1[j];
    68                     t2=p2[i]/p2[j];
    69                 }
    70                 else if(p1[i]*p2[j]<p1[j]*p2[i])
    71                 {
    72                     t1=p1[j]/p1[i];
    73                     t2=p2[j]/p2[i];
    74                 }
    75                 else if(p1[i]*p2[j]==p1[j]*p2[i])
    76                 {
    77                     t1=p1[i];
    78                     t2=p2[i];
    79                 }
    80                 if(1.0*t1/t2<t)
    81                 {
    82                     t=1.0*t1/t2;
    83                     tt1=t1;
    84                     tt2=t2;
    85                 }
    86             }
    87         g=gcd(tt1,tt2);
    88         cout<<tt1/g<<"/"<<tt2/g<<endl;
    89     }
    90 
    91     return 0;
    92 }

     

  • 相关阅读:
    Set up width and height tcl tk main window
    makefile
    itk_component add
    android的各种*.img 文件
    Install Android 2.2.1 Froyo On Nook Color [Advanced Guide]
    Android开机启动流程初探
    编译MTK6516脚本
    调试MTK6516错误总结
    Android开机启动流程初探
    编译MTK6516脚本
  • 原文地址:https://www.cnblogs.com/Annetree/p/6628385.html
Copyright © 2020-2023  润新知