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);
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM