PTA_语法入门赛

题源:https://pintia.cn/problem-sets/1768428576024760320/overview

7-1 格式化数字的显示-简单版

在金融领域对金额之类的数字,一般是在整数部分的每三个数字加一个千分位分隔符,分别对应1,000(千),1,000,000(百万),1,000,000,000(十亿)等等,另外在小数部分保留2位小数。例如1234567格式化后显示为1,234,567.00。

本题目要求读入1个7位整数,要求进行格式化的输出,输出时在合适的地方加上千分位分隔符,并补齐小数点后的两位。

分析

  • 输入输出
  • 直接定义7个char或者开数组
#include<stdio.h>

int main(){
    char s[10];
    scanf("%s", s);
    printf("%c,%c%c%c,%c%c%c.00",
           s[0],s[1],s[2],s[3],s[4],s[5],s[6]);
}

7-2 三角形判定

给你三个正整数,判断用这三个整数做边长是否能构成一个三角形。

分析

  • 任意两边之和大于第三边就能构成三角形。
  • 即最小的两边和大于第三边。
#include<stdio.h>
int max(int a,int b,int c){
    if(a<b) a=b;
    if(a<c) a=c;
    return a;
}
int main(){
    int a,b,c; scanf("%d%d%d",&a,&b,&c);
    int y = max(a,b,c);
    printf("%s", (a+b+c-y > y) ? "Yes":"No");
    return 0;
}

7-3 表面积和体积

读入5个整数a, b, c, d 和 e,计算物体的表面积和体积。你可以想像该物体是一个长宽高为a, b, c 的长方体,每一面中央都是凹进去的,而凹进去的深度为 d,沒凹进去的边框宽度 e。
如图:

在这里插入图片描述

分析

  • 表面积:做加法,在abc的基础上加小方块
  • 体积:做减法,在abc的基础上减去小方块
#include<stdio.h>
#define p (2*e)
int main(){
    int a,b,c,d,e;
    scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
    int s=2*(a*b+b*c+a*c) + 4*d*(2*(a+b+c)-6*p);
    int v=a*b*c-2*d*((a-p)*(c-p) + (b-p)*(c-p) +(a-p)*(b-p));
    printf("%d %d",s,v);
    return 0;
}

7-4 特殊数列求和

用户输入一个小于10的正整数,求1 + 12 + 123 + 1234+ …… 的前n项的和,当输入大于或等于10时,输出“data error!”

分析

  • for循环枚举,同步迭代数据
#include<stdio.h>
int main(){
    int n; scanf("%d", &n);
    if(n>=10){
        puts("data error!");
    }else{
        int ans = 0, t=0;
        for(int i=1; i<=n;i++){
            ans += t*10+i;
            t = t*10 + i;
            //printf("%d\n", ans);
        }
        printf("%d\n", ans);
    }
    return 0;
}

7-5 矩阵中的鞍点

如果矩阵A中存在元素A[i][j]满足下列条件:A[i][j]是第i行中值最大的元素,且又是第j列中值最小的元素,则称之为该矩阵的鞍点。请编写程序判断矩阵是否存在鞍点,并输出。

分析

  • 将问题分解为两个条件:1.同行最大、2.同列最小
  • 于是考虑开一个二维数组 b[i][j],当 b[i][j]=0\1\2时分别代表(i,j)这个点一个都不满足、满足一个、满足两个条件。
  • 最后答案就是满足两个条件的点。
#include<stdio.h>
#define  N 100
#include<string.h>
int a[N][N],b[N][N];

int main(){
    int t;scanf("%d", &t);
    while(t--){
        memset(b, 0, sizeof(b));
        int m,n; scanf("%d%d", &m, &n);
        for(int i=1; i<=m; i++)
            for(int j=1; j<=n; j++) scanf("%d", &a[i][j]);
        // 同行最大,在某一列
        for(int i=1; i<=m; i++){
            int id=1;
            for(int j=1; j<=n; j++)
                if(a[i][id] < a[i][j])id = j;
            b[i][id] = 1;
        }
        // 同列最小,在某一行
        for(int j=1; j<=n; j++){
            int id =1;
            for(int i=1; i<=m; i++)
                if(a[id][j] > a[i][j])id = i;
            b[id][j] ++;
        }
        int x=0,y=0;
        for(int i=1; i<=m; i++)
            for(int j=1; j<=n; j++)
                if(b[i][j]==2)x=i,y=j;
        // x--, y--;
        if(x) printf("(%d,%d)%d\n",x-1,y-1,a[x][y]);
        else puts("NONE");
    }
}

7-6 反素数

反素数寻找。反素数是指一个将其逆向拼写后也是一个素数的非回文数。例如:13和31都是素数且均不是回文数,所以13和31都是反素数。

分析

  • 使用函数解决更加方便,具体看代码
#include<stdio.h>

int isp(int n){
    for(int i=2; i<=n/i; i++)
        if(n%i==0) return 0;
    return n>1;
}
int re(int n){
    int t=n, a=0;
    while(t) a=a*10+t%10, t/=10;
    return a;
}
int ish(int n){
    return n == re(n);
}
int main(){
    int n; scanf("%d", &n);
    for(int i=1; i<n; i++){
        // printf("%d %d\n", re(i), isp(i));
        if(isp(i) && isp(re(i)) && !ish(i)){
            printf("%d ", i);
        }
    }
    return 0;
}

7-7 ISBN转换

图书都有唯一的ISBN码(书号)标识,ISBN分为10位(ISBN-10)和13位(ISBN-13,以“978”开头)两种。

设ISBN-13为978-7-302-56474-4,从ISBN-13转换为ISBN-10的具体步骤如下:
(1)从ISBN-13中删除前缀978和校验码(最后一位),得到ISBN-10的前面部分:7-302-56474,然后去掉该部分的“-”得到一个9位数字730256474

(2)重新计算校验码。将上一步得到的9位数字依序分别乘以从10,9,8,……,3,2,将其乘积相加得到累加和sum,求余数r=sum%11;若r=0,则校验码为0;否则求11与r的差数d=11-r,若d=10,则以“X”来表示校验码,否则校验码为d。即:
sum=7×10+3×9+0×8+2×7+5×6+6×5+4×4+7×3+4×2=216,r=216 % 11=7,d=11-7=4,因此校验码为4。

最终得到ISBN-10:7-302-56474-4。

要求把书号从ISBN-13转换为ISBN-10。

分析

  • 模拟,看清题目描述
  • 主要是想到较为简单的实现方式
  • 可以使用多个变量,但是代码较为繁琐
  • 考虑使用数组
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
    char s[33]; scanf("%s",s);
    int n=strlen(s), p=10, sum=0;
    for(int i=4; i<n-1; i++)
        if(isdigit(s[i])){
            sum += (s[i]-'0') * p--;
        }
    int r = sum%11;
    if(r==0) s[n-1]='0';
    else {
        int d=11-r;
        if(d==10) s[n-1]='X';
        else s[n-1]=d+'0';
    }
    puts(s+4);
    return 0;
}
  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值