7-16至7-25

7-16 回文日期 (100 分)

2020 年春节期间,有一个特殊的日期引起了大家的注意:2020年2月2日。因为如果将这个日期按“yyyymmdd” 的格式写成一个8 位数是20200202,恰好是一个回文数。我们称这样的日期是回文日期。

有人表示20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为不到2年之后就是下一个回文日期:20211202 即2021年12月2日。 也有人表示20200202 并不仅仅是一个回文日期,还是一个ABABBABA型的回文日期。对此小明也不认同,因为大约100 年后就能遇到下一个ABABBABA 型的回文日期:21211212 即2121 年12 月12 日。算不上“千年一遇”,顶多算“千年两遇”。

给定一个8 位数的日期,请你计算该日期之后下一个回文日期和下一个ABABBABA型的回文日期各是哪一天。

输入格式

输入包含一个八位整数N,表示日期。

输出格式

输出两行,每行1 个八位数。第一行表示下一个回文日期,第二行表示下一个ABABBABA 型的回文日期。

样例输入

20200202

样例输出

20211202
21211212

样例输入

89991231

样例输出

90011009
90900909

评测用例规模与约定

对于所有评测用例,10000101 ≤ N ≤ 89991231,保证N 是一个合法日期的8位数表示。

提示

本题目选自蓝桥杯竞赛,增加了一组测试样例。  

#include <stdio.h>
#include <stdlib.h>
int getT(int n)
{
    int a[2];
    a[1] = n%10;
    a[0] = n/10;
    n=0;
    n = a[1]*10+a[0];
    return n;
}
int inArray(int t,int a[],int n){
    for(int i=0;i<n;i++){
        if(t==a[i]) return 1;
    }
    return 0;
}
int isRun(int n){
    if(n%400==0) return 1;
    else if(n%100==0) return 0;
    else if(n%4==0) return 1;
    else return 0;
}
int main(void)
{
    int big[7] = {1,3,5,7,8,10,12};
    int small[11] = {1,3,4,5,6,7,8,9,10,11,12};
    int all[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int a,b,c,d;
    scanf("%2d%2d%2d%2d",&a,&b,&c,&d);
    int p = a,q=b,k=c,l=d;
    int flag=0;
    if(getT(a)==d&&getT(b)==c) {q++;k=1;l=1;flag=1;}
    if(q==100) {q=0;p++;}
    while(p!=getT(l)||q!=getT(k)){
        l++;
        if(k==2&&l==30&&isRun(p*100+q)){k++;l=1;}
        else if(k==2&&l==29&&(!isRun(p*100+q))){k++;l=1;}
        else if(l==31&&(k==4||k==6||k==9||k==11)){k++;l=1;}
        else if(l==32){k++;l=1;}

        if(k==13){q++;k=1;}
        if(q==100) {q=0;p++;}
    }
    printf("%02d%02d%02d%02d\n",p,q,k,l);
    int n = getT(a);
    if(n<1||n>12){
        while(n<1||n>12){
            a++;
            n = getT(a);
        }
        printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    }
    else if(b>a){
        a++;n = getT(a);
        while(n<1||n>12){
            a++;
            n = getT(a);
        }
        printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    }
    else if(b<a) printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    else if(c>n){
        a++;n = getT(a);
        while(n<1||n>12){
            a++;
            n = getT(a);
        }
        printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    }
    else if(c<n) printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    else if(d>=n){
        a++;n = getT(a);
        while(n<1||n>12){
            a++;
            n = getT(a);
        }
        printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
    }
    else printf("%02d%02d%02d%02d",getT(n),getT(n),n,n);
}

7-17 找“重点” (10 分)

在一个N×N的矩阵中,如果某个元素的值大于其上下左右四个相邻元素之和,则本题称这个元素为“重点”。本题要求寻找给定矩阵中的所有“重点”。

需要注意的是:

  • 矩阵中元素的坐标采用(x,y)的形式,x为元素所在的行号、y为元素所在的列号,xy均从0开始
  • 矩阵的行号由上至下增长;列号从左到右增长
  • 最上方一行的元素,其“上方”相邻元素,位于同列的最下方一行
  • 最下方一行的元素,其“下方”相邻元素,位于同列的最上方一行
  • 最左方一列的元素,其“左方”相邻元素,位于同行的最右方一列
  • 最右方一列的元素,其“右方”相邻元素,位于同行的最左方一列

输入格式:

第一行给出一个不大于400的正整数N

接下来N行,每行N个不超过500的正整数,用空格分隔,依次是矩阵从最上方一行开始、每行从左至右排列的N×N个元素。

输出格式:

如果矩阵中有“重点”,则在每行输出一个“重点”元素的坐标,若需要输出的元素多于一个,则按照行号从小到大、同一行中列号从小到大的顺序输出。每个坐标先输出行号、再输出列号,中间空一格。

如果矩阵中没有“重点”,则在一行中先输出None!然后输出矩阵中所有元素之和,中间空一格。

输入样例1:

4
1 1 1 1
1 5 1 5
1 1 1 1
1 1 5 1

输出样例1:

1 1
1 3
3 2

输入样例2:

3
1 1 1
1 1 1
1 1 1

输出样例2:

None! 9

 

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

int main(void)
{
    int n,flag=0,sum=0;
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            sum+=a[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int top = (j-1+n)%n,down = (j+1+n)%n;
            int left = (i-1+n)%n,right = (i+1+n)%n;
            if(a[i][j]>a[i][top]+a[i][down]+a[left][j]+a[right][j]){
                flag=1;
                printf("%d %d\n",i,j);
            }
        }
    }
    if(flag==0) printf("None! %d\n",sum);
}

7-18 平行四边形(2)(*) (10 分)

请编写程序,输入平行四边形的宽度和高度,输出由星号组成的平行四边形。

输入格式

宽度、高度 (均为正整数)

输出格式

星号组成的平行四边形 (参见输出样例)

输入样例

10 5

输出样例

    * * * * * * * * * *
   * * * * * * * * * *
  * * * * * * * * * *
 * * * * * * * * * *
* * * * * * * * * *

提示:星号之间空一格,行末没有多余的空格。

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

int main(void)
{
    int m,n;
    scanf("%d%d",&m,&n);
    for(int i=0;i<n;i++){
        for(int j=1;j<n-i;j++) printf(" ");
        for(int j=0;j<m;j++) {
            printf("*");
            if(j!=m-1) printf(" ");
        }
        printf("\n");
    }
}

 

7-19 平行四边形(1)(*) (10 分)

请编写程序,输入平行四边形的宽度和高度,输出由星号组成的平行四边形。

输入格式

宽度、高度 (均为正整数)

输出格式

星号组成的平行四边形 (参见输出样例)

输入样例

20 5

输出样例

    ********************
   ********************
  ********************
 ********************
********************

提示:行末没有多余的空格。

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

int main(void)
{
    int m,n;
    scanf("%d%d",&m,&n);
    for(int i=0;i<n;i++){
        for(int j=1;j<n-i;j++) printf(" ");
        for(int j=0;j<m;j++) {
            printf("*");
        }
        printf("\n");
    }
}

7-20 双曲正弦函数(*) (10 分)

根据麦克劳林公式计算 sinhx 的值。

题图.jpg

输入格式

x ϵ

注:x 为指数,ϵ 为计算精度。

输出格式

y

注:y 为 e​x​​ 的值。用 %f 格式限定符输出 6 位小数。

要求:所计算的最后一项的绝对值小于 ϵ。

输入样例

0.5 0.0000001

输出样例

0.521095
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double fun1(int n){
    double t=1.0;
    for(n;n>0;n--)t*=n;
    return t;
}
double fun2(double x,int n){
    double t=1;
    for(n;n>0;n--)t*=x;
    return t;
}
int main(void)
{
    double x,e,s;
    double sum = 0;
    scanf("%lf%lf",&x,&e);
    int i=1;
    do{
        s = fun2(x,i)/fun1(i);
        sum = sum+s;
        i+=2;
    }while(e<fabs(s));
    printf("%.6f",sum);
}

7-21 双曲余弦函数(*) (10 分)

根据麦克劳林公式计算 coshx 的值。

题图.jpg

输入格式

x ϵ

注:x 为指数,ϵ 为计算精度。

输出格式

y

注:y 为 coshx 的值。用 %f 格式限定符输出 6 位小数。

要求:所计算的最后一项的绝对值小于 ϵ。

输入样例

0.5 0.0000001

输出样例

1.127626

 

#include <stdio.h>
int main(){
    int a;
    int b;
    int r=1;
    scanf("%d%d",&a,&b);
    while(r!=0){
        r = a % b;
        a = b;
        b = r;
    }
    printf("%d\n",a);
    return 0;
}

7-22 输出最大公约数 (100 分)

输入两个数,输出它们的最大公约数。

输入样例:

36 24

输出样例:

12
#include <stdio.h>
int main(){
    int a;
    int b;
    int r=1;
    scanf("%d%d",&a,&b);
    while(r!=0){
        r = a % b;
        a = b;
        b = r;
    }
    printf("%d\n",a);
    return 0;
}

 

7-23 输出最小公倍数 (100 分)

输入两个数,输出它们的最小公倍数。

输入样例:

36  24

输出样例:

72
#include <stdio.h>
int main(){
    int a;
    int b;
    int r=1;
    scanf("%d%d",&a,&b);
    int k = a*b;
    while(r!=0){
        r = a % b;
        a = b;
        b = r;
    }
    printf("%d\n",k/a);
    return 0;
}

 

7-24 素数判断 (100 分)

输入一个正整数,输出其是否为素数。

输入样例:

15

输出样例:

NO

输入样例:

53

输出样例:

YES
#include <stdio.h>
int main(){
    int a;
    scanf("%d",&a);
    if(a==0||a==1)printf("NO\n");
    else if(a==2)printf("YES");
    else {
        int flag = 1;
        for(int i=2;i<a;i++){
            if(a%i==0) {printf("NO\n");flag=0;break;}
        }
        if(flag) printf("YES\n");
    }
    return 0;
}

 

7-25 根号2的迭代 (90 分)

有一个迭代公式:x​n​​=√​x​n−1​​+2​​​,无论x的初值(正数)选的多么大,若干次迭代之后,都与√​2​​​无限接近,也就是说x序列的极限是√​2​​​。假设x​0​​=99999999(8个9),编程输入一个正整数n,输出x​n​​的值(保留10位小数)。

输入样例:

8

输出样例:

x[8]=2.0051798692

输入样例:

16

输出样例:

x[16]=2.0000000790
#include <stdio.h>
#include <math.h>
double func(int n)
{
    if(n==0) return 99999999;
    return sqrt(func(n-1)+2);
}
int main(){
    int n;
    scanf("%d",&n);
    printf("x[%d]=%.10f",n,func(n));

}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值