题源: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;
}