A,求最大公约数gcd老师上课给过模板可以照着敲,辗转相除循环法不慢不可能超时,这里给出辗转相除的递归函数写法。最大公约数用两个数的乘积除以gcd就行
#include<stdio.h>
int n, m, rua, T;
int gcd(int x, int y) //辗转相除的函数写法,看上去是不是很简单
{
return y ? gcd(y, x%y) : x;
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m);
rua = gcd(n, m); //你可能会在文章里多次见到这个丢人的变量名
printf("%d %d\n", rua, n*m/rua);
}
return 0;
}
B,预处理每一种得分会得到多少学分用数组score[ ]记录,然后循环计算就够了,T次循环后累加得上面的分号上的num1,和分号下的num2,相除,得解
#include<stdio.h>
#define maxn 105
#define FOR(a, b, c) for(int a=b; a<=c; a++)
int n, m, T, sum1, sum2, score[maxn];
double ans=0.00;
int main()
{
for(int i=0; i<=100; i++)
{
if(i<60) score[i] = 0;
if(i>=60 && i<70) score[i] = 1;
if(i>=70 && i<80) score[i] = 2;
if(i>=80 && i<90) score[i] = 3;
if(i>=90 && i<=100) score[i] = 4;
}
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m);
sum1 += n*score[m];
sum2 += n;
}
ans = (double)sum1 / (double)sum2; //注意要转成浮点类型才能计算
//cout<<sum1<<" "<<sum2<<endl;
printf("%.2f", ans);
return 0;
}
C,上课有讲过实心菱形的画法,现在仅在其边界条件上打字符即可,思路还是分成上下两个三角分别画
#include<stdio.h>
#define FOR(a, b, c) for(int a=b; a<=c; a++) //自己定义的循环函数习惯写法,
//我到时候看看哪个头铁的敢直接复制粘贴,遇到查重biss
int n, m, T;
char ch;
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d %c", &n, &ch);
//上半三角形
FOR(i, 1, n)
{
FOR(j, 1, 2*n)
{
if(i+j==n+1 || n-1+i==j)
{
printf("%c", ch);
continue;
}
printf(" "); //不在边界上就输出空格
}printf("\n");
}
//下半部分
for(int i=n-1; i>=1; i--)
{
FOR(j, 1, 2*n)
{
if(i+j==n+1 || n-1+i==j)
{
printf("%c", ch);
continue;
}
printf(" ");
}printf("\n");
}
}
return 0;
}
D,加减乘除分别计算,然后约分用分号上和分号下同时除以gcd,注意特殊情况:0;分母为1;负号的写法。就能过了
#include<stdio.h>
int T, a, b, c, d, up, down, rua, flag;
char ch;
int gcd(int x, int y)
{
return y ? gcd(y, x%y) : x;
}
void add()
{
up = a*d + b*c;
down = b*d;
}
void sub()
{
up = a*d - b*c;
down = b*d;
if(up<0) //题目要求都是正整数,但是减法时会出现负数情况
{
flag = 1; //出现负数就把flag立起来,之后循环结束又初始化
up = -up; //主要是怕负数对gcd的计算产生影响,所以把他变成正数,输出时处理负号
}
}
void mul()
{
up = a*c;
down = b*d;
}
void mod()
{
up = a*d;
down = b*c;
}
void Output()
{
if(up==0) //如果分子等于0,直接输出0并结束
{
printf("0");
return;
}
rua = gcd(up, down); //约分过程
up /= rua;
down /= rua;
if(flag == 1) //负数
printf("-");
if(down==1)
{
printf("%d\n", up);
return;
}
printf("%d/%d\n", up, down);
return;
}
int main()
{
scanf("%d", &T);
while(T--)
{
flag = 0;
scanf("%d %d %d %d %c", &a, &b, &c, &d, &ch);
printf("%d/%d%c%d/%d=", a, b, ch, c, d); //先打印算式,因为这一步不影响计算和结果
if(ch=='+') add(); //不喜欢用switch结构……
if(ch=='-') sub();
if(ch=='*') mul();
if(ch=='/') mod();
Output(); //输出结果
}
return 0;
}
E,之前写过博客,这里直接放链接吧,AC代码文章里有
关于C语言作业中 E-排列问题 的字符输入