UESTC-数院18级 C语言上机作业2 题解

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-排列问题 的字符输入

猜你喜欢

转载自blog.csdn.net/qq_43455647/article/details/89098215
今日推荐