8:46 书接上回——还有24题没刷,开干~
习题8-10 输出学生成绩
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
double *a=malloc(sizeof(double)*n);
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
int max=0,min=0;
double ave,sum=a[0];
for(int i=1;i<n;i++)
{
sum+=a[i];
if(a[i]<a[min])
min=i;
if(a[i]>a[max])
max=i;
}
printf("average = %.2f\n",sum/n);
printf("max = %.2f\n",a[max]);
printf("min = %.2f\n",a[min]);
return 0;
}
习题7-8 字符串转换成十进制整数
#include<stdio.h>
#include<string.h>
int main()
{
int flag1=0; //为0表示正
int flag2=0; //为0表示负号没有在十六进制前出现
char ch;
long long res=0;
while(scanf("%c",&ch),ch!='#')
{
if(flag2==0)
{
if(ch=='-')
flag1=1;
}
if(ch>='0'&&ch<='9')
{
flag2=1;
res=res*16+ch-'0';
}
if(ch>='a'&&ch<='f')
{
flag2=1;
res=res*16+ch-'a'+10;
}
if(ch>='A'&&ch<='F')
{
flag2=1;
res=res*16+ch-'A'+10;
}
}
if(res==0){ //0直接输出,不要管前边是否有正负号
printf("0");
return 0;
}
if(flag1==0&&flag2==1) //有数字且没负号
printf("%lld\n",res);
if(flag1==1&&flag2==1) //有数字且有负号
printf("-%lld\n",res);
return 0;
}
习题3-5 三角形判断(。。。出师不利,敲%敲成&了,不用编译器是这样的)
#include<stdio.h>
#include<math.h>
int main()
{
double x1,y1,x2,y2,x3,y3;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
double d1=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
double d2=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
double d3=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
int flag=0;
if(d1+d2>d3&&d1+d3>d2&&d2+d3>d1)
if(d1-d2<d3&&d1-d3<d2&&d3-d2<d1)
flag=1;
double C,S;
if(flag==1)
{
double q=(d1+d2+d3)/2;
C=d1+d2+d3;
S=sqrt(q*(q-d1)*(q-d2)*(q-d3));
printf("L = %.2f, A = %.2f",C,S);
}
else
printf("Impossible");
return 0;
}
练习6-3 英文字母替换加密(大小写转换+后移1位)(脑子抽抽了,一直想怎么对ASCII求余)
#include<stdio.h>
int main()
{
char str[1001];
gets(str);
for(int i=0;str[i]!='\0';i++)
{
if(str[i]>='a'&&str[i]<='z')
str[i]=(str[i]-'a'+1)%26+'A';
else if(str[i]>='A'&&str[i]<='Z')
str[i]=(str[i]-'A'+1)%26+'a';
}
puts(str);
return 0;
}
练习7-3 将数组中的数逆序存放
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n/2;i++)
{
int temp=a[i];
a[i]=a[n-i-1];
a[n-i-1]=temp;
}
for(int i=0;i<n-1;i++)
printf("%d ",a[i]);
// for(int i=n-1;i>=1;i--)
// {
// printf("%d ",a[i]); //整活版
// }
printf("%d",a[n-1]);
return 0;
}
练习7-10 查找指定字符
#include<stdio.h>
int main()
{
char key;
scanf("%c",&key);
getchar(); //别把回车读进去了
char str[81];
gets(str);
int index=-1;
for(int i=0;str[i]!='\0';i++)
{
if(str[i]==key)
index=i;
}
if(index==-1)
printf("Not Found");
else
printf("index = %d",index);
return 0;
}
习题4-5 换硬币(再夸一次,暴力YYDS)
#include<stdio.h>
int main()
{
int x;
scanf("%d",&x);
int count=0;
for(int five=x/5;five>=1;five--)
for(int two=x/2;two>=1;two--)
for(int one=1;one<=x;one++)
{
if(one+two*2+five*5==x)
{
count++;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",five,two,one,one+two+five);
}
}
printf("count = %d\n",count);
return 0;
}
习题7-1 选择法排序
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b){
return *(int *)b-*(int *)a;
}
int main()
{
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,n,sizeof(int),cmp);
for(int i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);
}
习题7-3 判断上三角矩阵
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
for(int i=0;i<t;i++)
{
int n;
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]);
int flag=0;
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
if(a[i][j]!=0)
{
flag=1;
}
if(flag==1)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
习题7-5 找鞍点
#include<stdio.h>
int main()
{
int n;
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]);
//找每行最大值的位置,然后立马与该列其他值比较若最小则找到
for(int i=0;i<n;i++)
{
int max=a[i][0];
int maxi=i;
int maxj=0;
for(int j=1;j<n;j++) //题目不说至多一个鞍点么
if(a[i][j]>=max) //测试点2需要最后一个是鞍点咱也不知道为啥。只能>=而不是>了
{
max=a[i][j];
maxi=i;
maxj=j;
}
int flag=0; //判断该列有没有比自己更小的元素
for(int k=0;k<n;k++)
if(a[k][maxj]<max)
{
flag=1;
break;
}
if(flag==0)
{
printf("%d %d",maxi,maxj);
return 0;
}
}
printf("NONE");
return 0;
}
练习3-8 查询水果价格
#include <stdio.h>
int main() {
float prices[] = {3.00, 2.50, 4.10, 10.20};
printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
int queryCount = 0;
int fruitCode;
while (queryCount < 5) {
scanf("%d", &fruitCode);
if (fruitCode == 0) {
break;
} else if (fruitCode >= 1 && fruitCode <= 4) {
printf("price = %.2f\n", prices[fruitCode - 1]);
queryCount++;
} else {
printf("price = 0.00\n");
queryCount++;
}
}
return 0;
}
习题3-3 出租车计价(又是(int)墙砖和%.0f的区别,题意描述的也很有bug)
#include<stdio.h>
int main()
{
float mile;
int minute;
float price;
scanf("%f%d",&mile,&minute);
if(mile<=3)
price=10;
else if(mile<=10)
price=(mile-3)*2+10;
else
price=24+(mile-10)*3;
while(minute>=0)
{
minute-=5;
if(minute<0)
break;
price+=2;
}
printf("%.0f",price);
return 0;
}
练习4-3 求给定精度的简单交错序列部分和
#include<stdio.h>
#include<math.h>
int main()
{
double eps;
scanf("%lf",&eps);
double res=0;
int i=1;
double sign=1;
double temp=1;
if(fabs(temp)<eps)
{
printf("sum = %.6f",temp); //好蠢啊,一直以为精度大于第一项就不加第一项了
return 0;
}
while(fabs(temp)>=eps)
{
res+=temp;
sign=-sign;
i+=3;
temp=sign/(1.0*i);
}
printf("sum = %.6f",res);
return 0;
}
习题9-1 时间换算
#include<stdio.h>
int main()
{
int hh,mm,ss,n;
scanf("%d:%d:%d",&hh,&mm,&ss);
scanf("%d",&n);
int carrys=0,carrym=0;
if((ss+n)/60==1)
carrys=1;
ss=(ss+n)%60;
if((mm+carrys)/60==1) //本题限定n<60自然好写,本代码还可轻易改成对任意n
carrym=1;
mm=(mm+carrys)%60;
hh=(hh+carrym)%24;
printf("%02d:%02d:%02d",hh,mm,ss);
return 0;
}
练习7-9 计算天数(这种写了几百遍了,懒得写了)
#include <stdio.h>
int daysOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int isLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main()
{
int year, month, day;
scanf("%d/%d/%d", &year, &month, &day);
int days = 0;
for (int i = 1; i < month; i++)
{
days += daysOfMonth[i];
if (i == 2 && isLeapYear(year))
{
days++; // 闰年的2月有29天
}
}
days += day;
printf("%d\n", days);
return 0;
}
练习7-7 矩阵运算
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n][n];
int sum=0;
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++)
{
if(j==n-i-1||j==n-1||i==n-1)
sum-=a[i][j];
}
}
printf("%d\n",sum);
return 0;
}
习题4-9 打印菱形图案
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<=n/2;i++)
{
for(int j=0;j<n-2*i-1;j++)
printf(" ");
for(int j=0;j<i*2+1;j++)
printf("* ");
printf("\n");
}
for(int i=n/2+1;i<n;i++)
{
for(int j=n-i;j<=i;j++)
printf(" ");
for(int j=i*2-n+1;j<n;j++)
printf("* ");
printf("\n");
}
}
习题3-4 统计学生成绩
#include <stdio.h>
int main()
{
int N;
scanf("%d", &N);
int score, countA = 0, countB = 0, countC = 0, countD = 0, countE = 0;
for (int i = 0; i < N; i++)
{
scanf("%d", &score);
if (score >= 90)
{
countA++;
}
else if (score >= 80)
{
countB++;
}
else if (score >= 70)
{
countC++;
}
else if (score >= 60)
{
countD++;
}
else
{
countE++;
}
}
printf("%d %d %d %d %d\n", countA, countB, countC, countD, countE);
return 0;
}
习题9-4 查找书籍
#include <stdio.h>
#include <string.h>
struct Book {
char name[31];
double price;
};
int main()
{
int n;
scanf("%d", &n);
getchar(); // 读取换行符
struct Book books[n];
for (int i = 0; i < n; i++)
{
gets(books[i].name);
scanf("%lf", &books[i].price);
getchar();
}
double maxPrice = books[0].price;
double minPrice = books[0].price;
int maxIndex = 0;
int minIndex = 0;
for (int i = 1; i < n; i++)
{
if (books[i].price > maxPrice)
{
maxPrice = books[i].price;
maxIndex = i;
}
if (books[i].price < minPrice)
{
minPrice = books[i].price;
minIndex = i;
}
}
printf("%.2lf, %s\n", books[maxIndex].price, books[maxIndex].name);
printf("%.2lf, %s\n", books[minIndex].price, books[minIndex].name);
return 0;
}
习题9-5 通讯录排序(把生日抽象成int型比大小确实方便)
#include <stdio.h>
#include <string.h>
struct Friend {
char name[11];
int birthday;
char phone[18];
};
int main()
{
int n;
scanf("%d", &n);
// 处理输入超出限制的情况
if (n > 10) {
n = 10;
}
struct Friend friends[n];
for (int i = 0; i < n; i++)
{
scanf("%s %d %s", friends[i].name, &friends[i].birthday, friends[i].phone);
}
// 根据出生日期进行年龄排序(从大到小)
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (friends[j].birthday > friends[j + 1].birthday)
{
struct Friend temp = friends[j];
friends[j] = friends[j + 1];
friends[j + 1] = temp;
}
}
}
// 输出朋友信息
for (int i = 0; i < n; i++)
{
printf("%s %d %s\n", friends[i].name, friends[i].birthday, friends[i].phone);
}
return 0;
}
习题7-2 求一批整数中出现最多的个位数字
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int hash[10]={0};
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
do //测试点4卡while卡半天,突然想起来可以输入0,那就do-while
{
hash[x%10]++;
x=x/10;
}while(x!=0);
}
int max=0;
for(int i=1;i<=9;i++)
{
if(hash[i]>hash[max])
max=i;
}
printf("%d: ",hash[max]);
int k=0;
int res[10]={0};
for(int i=0;i<=9;i++)
if(hash[i]==hash[max])
{
res[k++]=i;
}
for(int i=0;i<k-1;i++)
printf("%d ",res[i]);
printf("%d",res[k-1]);
return 0;
}
习题6-7 简单计算器
#include <stdio.h>
int main() {
char op; // 运算符
int num, result;
// 读取第一个数
if(scanf("%d", &result) != 1) {
printf("ERROR\n");
return 0;
}
while(1) {
// 读取运算符
if(scanf("%c", &op) != 1) {
break;
}
if(op == '=') {
break;
}
// 读取下一个数
if(scanf("%d", &num) != 1) {
printf("ERROR\n");
return 0;
}
// 根据运算符计算
switch(op) {
case '+':
result += num;
break;
case '-':
result -= num;
break;
case '*':
result *= num;
break;
case '/':
if(num == 0) {
printf("ERROR\n");
return 0;
}
result /= num;
break;
default:
printf("ERROR\n");
return 0;
}
}
printf("%d\n", result);
return 0;
}
练习7-8 方阵循环右移
#include <stdio.h>
int main() {
int m, n;
scanf("%d %d", &m, &n);
int matrix[6][6];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// 在这里重新计算 m 对应的正确移动次数
m = m % n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", matrix[i][(j + n - m) % n]); //有待理解
}
printf("\n");
}
return 0;
}
练习7-4 找出不是两个数组共有的元素
#include <stdio.h>
int main()
{
int n, m;
int i, j;
int a[20], b[20], c[20];
//输入
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", a + i);
scanf("%d", &m);
for (int i = 0; i < m; i++)
scanf("%d", b + i);
//判断
int cnt = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (a[i] == b[j])
break;
}
if (j == m)
c[cnt++] = a[i];
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (b[i] == a[j])
break;
}
if (j == n)
c[cnt++] = b[i];
}
//相同数字不输出
printf("%d", c[0]);
for(i = 1; i < cnt;i++)
{
for (j = 0; j < i; j++)
{
if (c[i] == c[j])
{
break;
}
}
if (j == i)
{
printf(" %d", c[i]);
}
}
return 0;
}
PS:最后两题实在懒得写了,最后一题也不太会,后期有时间好好研究研究。结束!完结撒花~