文章目录
- 7-1 格式化数字的显示-简单版
- 7-2 三角形判定
- 7-3 表面积和体积
- 7-4 特殊数列求和
- 7-5 矩阵中的鞍点
- 7-6 反素数
- 7-7 ISBN转换
题源: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;
}