MOOC哈工大2020C语言程序设计精髓编程题在线测试第九周

重复数字检查(4分)

题目内容:

从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“Repeated digit!”;否则显示“No repeated digit!”。

已知函数原型:

int CountRepeatNum(int count[], int n);

若有重复数字,则该函数返回重复出现的数字;否则返回-1.

#define N 100
int CountRepeatNum(int count[], int n);

int main()
{
    long n;
    int count = 0, temp, result, a[N];
    printf("Input n:\n");
    scanf("%ld", &n);
    while (n != 0)
    {
        temp = n  % 10;
        a[count] = temp;
        n = n / 10;
        count++;
    }
    result = CountRepeatNum(a,count);
    if(result == -1)
    {
        printf("No repeated digit!\n");
    }
    else
    {
        printf("Repeated digit!\n");
    }
    return 0;
}

int CountRepeatNum(int count[], int n)
{
    int flag = -1;
    for (int i = 0; i < n; ++i)
    {
        for (int j = i + 1; j < n; ++j)
        {
            if(count[i] == count[j])
            {
                flag = count[j];
                return flag;
            }
        }
    }
    return flag;
}

 

2 教授的课(4分)

题目内容:

教授正在为一个有N个学生的班级讲授离散数学课。他对某些学生缺乏纪律性很不满意,于是决定:如果课程开始后上课的人数小于K,就取消这门课程。从键盘输入每个学生的到达时间,请编程确定该课程是否被取消。如果该门课程被取消,则输出“Yes”,否则输出“No”。假设教授在时刻0开始上课。如果一个学生的到达时间是非正整数,则表示该学生在上课前进入教室。如果一个学生的到达时间是正整数,则表示该学生在上课后进入教室。如果一个学生在时刻0进入教室,也被认为是在上课前进入教室。假设到达时间的绝对值不超过100,学生数N不超过1000。要求在输入学生的到达时间之前,先输入N和K。

已知函数原型:

//函数功能:根据数组a中记录的学生到达时间确定课程是否被取消,取消则返回1,否则返回0

int IsCancel(int a[], int n, int k);

#define N 1000

int IsCancel(int a[], int n, int k);

int main()
{
    int k, n, result, a[N];
    printf("Input n,k:\n");
    scanf("%d,%d", &n, &k);
    result = IsCancel(a, n, k);
    if(result)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}

int IsCancel(int a[], int n, int k)
{
    int count = 0;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
        if(a[i] <= 0)
        {
            count++;
        }
    }
    if(count < k)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

 

寻找鞍点(4分)

题目内容:

请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”

已知函数原型:

void FindSaddlePoint(int a[][N], int m, int n);

在该函数中输出有无鞍点的信息

#define N 10

void FindSaddlePoint(int a[][N], int m, int n);

int main()
{
    int m, n, a[N][N];
    printf("Input m,n:\n");
    scanf("%d,%d", &m, &n);
    FindSaddlePoint(a, m, n);
    return 0;
}
//按行搜索找最大值,然后判断该列是否是最小值
void FindSaddlePoint(int a[][N], int m, int n)
{
    int max, min, x, y, z, flag = 0;
    printf("Input matrix:\n");
    for (int i = 0; i < m; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = 0; i < m; ++i)
    {
        x = z = i;
        y = 0;
        max = a[x][y];
        for (int j = 0; j < n; ++j)
        {
            //找先行最大值的坐标
            if(a[i][j] > max)
            {
                max = a[i][j];
                //记录最大值的坐标
                x = i;
                y = j;
            }
        }
        //最小值等于行的最大值
        min = max;
        //按列查找最小值
        for (int k = 0; k < m; ++k)
        {
            if(a[k][y] < min)
            {
                min = a[k][y];
                z = k;
            }
        }
        //坐标要相等
        if(x == z)
        {
            flag = 1;
            break;
        }
    }
    if(flag)
    {
        printf("a[%d][%d] is %d\n", x, y, a[x][y]);
    }
    else
    {
        printf("No saddle point!\n");
    }
}

 

4 计算三位阶乘和数(4分)

题目内容:

试求出所有三位阶乘和数:m=a!+b!+c!(其中a为百位数字,b为十位数字,c为个位数字。约定0!=1,并输出所有的m)

输入格式: 无

输出格式:"%ld\n"

int Func(int n);

int main()
{
    int a, b, c;
    long m;
    for (m = 100; m < 1000; ++m)
    {
        a = m / 100;
        b = m / 10 % 10;
        c = m % 10;
        if(m == Func(a) + Func(b) + Func(c))
        {
            printf("%ld\n", m);
        }
    }
    return 0;
}

int Func(int n)
{
    if(n < 1)
    {
        return 1;
    }
    return n * Func(n - 1);
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值