程序設計入門——C語言(翁凱老師)(數組,字符串,指針)


  • 高精度小數(10分)(mooc第六周編程練習)

題目內容:

由於計算機內部表達方式的限制,浮點運算都有精度問題,為了得到高精度的計算結果,就需要自己設計實現方法。

(0,1)之間的任何浮點數都可以表達為兩個正整數的商,為了表達這樣兩個數的商,可以將相除的結果以多個整數來表示,每個整數表示結果的一位。即商的第一位用一個整數來表示,第二位用另一個整數來表示,以此類推,就可以輸出一個高精度的除法結果了。

如16/19的結果0.8421052631...就可以依次輸出8、4、2、1、0、5、2、6、3、1...。

而除法的過程,則可以模仿人工列豎式做除法的方式,先將被除數乘以10,得到一位商以后,將余數乘以10作為下一輪計算的被除數:

    160/19->8余8

    80/19->4余4

    ...

當某次余數為0時,則表明除盡。

現在,請寫一個程序,輸入一個分數,計算出它的小數形式。無論是否可以除盡,輸出最多小數點后200位。

 輸入格式:

形如

    a/b

的兩個數,其中10<=a<b<100。也就是說,這個小數一定是小於1的正數。

提示:輸入是帶着兩個數中間的“/”的,所以scanf應采用“%d/%d”這樣的輸入格式。

 輸出格式:

形如

    0.xxxxxxxxx

的小數,小數點后最多200位。輸出結束的時候要帶着回車換行。如果a/b是一個有限不循環小數,則輸出完所有的有效位就可以了,不需要再輸出后面的0來湊滿200位。

 輸入樣例:

16/19

 輸出樣例:

0.84210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684210526315789473684

 時間限制:500ms內存限制:32000kb

// 高精度小數

#include<stdio.h>

int main(){
    const int maxsize = 200;
    int M, N, count=0, reminder;
    scanf("%d/%d", &M, &N);
    int a[maxsize];
// 輸入的兩個整數M,N 其中 M<N, 下面for循環的作用是計算200位小數點以內的M/N的結果
    for (int i=0;i<200;i++){
        a[i] = M * 10 / N;
        reminder = M * 10 % N;
        M = reminder;
        count ++;
        if (reminder == 0) break;
    }
    printf("0.");
// 如果結果是有限循環小數,就不用輸出到200位
    for (int j=0;j<count;j++) printf("%d", a[j]);
    return 0;
}
  •  多項式加法(5分)(第七周編程作業)

題目內容:

一個多項式可以表達為x的各次冪與系數乘積的和,比如:

2x6+3x5+12x3+6x+20

現在,你的程序要讀入兩個多項式,然后輸出這兩個多項式的和,也就是把對應的冪上的系數相加然后輸出。

程序要處理的冪最大為100。

 輸入格式:

總共要輸入兩個多項式,每個多項式的輸入格式如下:

每行輸入兩個數字,第一個表示冪次,第二個表示該冪次的系數,所有的系數都是整數。第一行一定是最高冪,最后一行一定是0次冪。

注意第一行和最后一行之間不一定按照冪次降低順序排列;如果某個冪次的系數為0,就不出現在輸入數據中了;0次冪的系數為0時還是會出現在輸入數據中。

 輸出格式:

從最高冪開始依次降到0冪,如:

2x6+3x5+12x3-6x+20

注意其中的x是小寫字母x,而且所有的符號之間都沒有空格,如果某個冪的系數為0則不需要有那項。

 輸入樣例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

 輸出樣例:

4x6+6x5+12x3+12x2+12x+40

時間限制:500ms內存限制:32000kb
// 多項式加法

#include<stdio.h>
int main(){
    int a[101] = {0};
    int M, N, max=0, flag=0, temp=0;
    scanf("%d %d", &M, &N);
// 讀取各冪次的多項式,並合並同類項
    while(1){
        a[M] += N;
        if (M == 0) flag++;
        if (flag == 2) break;
        scanf("%d %d", &M, &N);
    }
// 讀取最高冪次項
    for (int i=100;i>=0;i--){
        if(a[i]!=0) {
            max = i;
            break;
        }
    }
// 分情況輸出多項式
    for (int i=max;i>=0;i--){
// 當多項式冪次位1時
        if (i==0) {
            if (a[0]<0)printf("%d", a[0]);
            else if (i == max) printf("%d", a[0]);
            else printf("+%d", a[0]);
        }
// 當多項式系數為1時
        else if (a[i] == 1) {
            if (i==1 && max != 1) printf("+x");
            else if (i == max) printf("x%d", max);
            else printf("+x%d", i);
            }
// 當多項式系數為-1時
        else if (a[i] == -1){
            if (i==1) printf("-x");
            else printf("-x%d", i);            
        }
// 當多項式系數大於1時
        else if (a[i] > 1){
            if (i==1 && max != 1) printf("+%dx", a[1]);
            else if (i==max) printf("%dx%d", a[i], i);
            else printf("+%dx%d", a[i], i);
        }
// 當多項式系數小於-1時
        else if (a[i] < -1){
            if (i==1) printf("%dx", a[1]);
            else printf("%dx%d", a[i], i);
        }
    }
    return 0;
}
    
  •  鞍點(5分)(mooc第七周編程練習)

題目內容:

給定一個n*n矩陣A。矩陣A的鞍點是一個位置(i,j),在該位置上的元素是第i行上的最大數,第j列上的最小數。一個矩陣A也可能沒有鞍點。

你的任務是找出A的鞍點。

 輸入格式:

輸入的第1行是一個正整數n, (1<=n<=100),然后有n行,每一行有n個整數,同一行上兩個整數之間有一個或多個空格。

輸出格式:

對輸入的矩陣,如果找到鞍點,就輸出其下標。下標為兩個數字,第一個數字是行號,第二個數字是列號,均從0開始計數。

如果找不到,就輸出

NO

題目所給的數據保證了不會出現多個鞍點。

 輸入樣例:

1 7 4 1 

4 8 3 6 

1 6 1 2 

0 7 8 9

 輸出樣例:

2 1

 

時間限制:500ms內存限制:32000kb
// 鞍點

#include<stdio.h>
int main(){
    int N, flag = 1;
    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 = 0, max_j=0, min_i=i;
        max = a[i][0];
// 讀取一行最大的數字max,並記錄該數字的位置
        for (int j=1;j<N;j++){
            if (max<a[i][j]) {
                max = a[i][j];
                max_j = j;
            }
        }
        int k=0;
// 判斷數字max是否是該列最小的數字,如果是立即退出循環,flag置0
        for (;k<N;k++){
            if (a[min_i][max_j]>a[k][max_j]) break;
        }
        if (k == N) {
            flag = 0;
            printf("%d %d", min_i, max_j);
            break;
        }
    }
// 如果存在鞍點,flag為0,不存在flag為1,且輸出NO
    if (flag) printf("NO");
    return 0;
}

 

  • 單詞長度(4分)(mooc第八周編程練習)

題目內容:

你的程序要讀入一行文本,其中以空格分隔為若干個單詞,以‘.’結束。你要輸出這行文本中每個單詞的長度。這里的單詞與語言無關,可以包括各種符號,比如“it's”算一個單詞,長度為4。注意,行中可能出現連續的空格。

 輸入格式:

輸入在一行中給出一行文本,以‘.’結束,結尾的句號不能計算在最后一個單詞的長度內。

 輸出格式:

在一行中輸出這行文本對應的單詞的長度,每個長度之間以空格隔開,行末沒有最后的空格。

 輸入樣例:

It's great to see you here.

 輸出樣例:

4 5 2 3 3 4

時間限制:500ms內存限制:32000kb
// 單詞長度

#include<stdio.h>
int main(){
    char word;
    int i=0;
    while(1){
        scanf("%c", &word);
// 分三種情況討論,當遇到'.'時,如果前面有單詞,輸出單詞位數,沒有則直接跳出循環
        if (word == '.'){
            if (i!=0) printf("%d", i);
            break;
        }
// 當遇到' '時,如果前面有單詞,輸出單詞位數,且單詞計數置零
        else if(word == ' '){
            if (i!=0) printf("%d ", i);
            i = 0;
        }
// 遇到單詞時,直接計數++
        else i++;
    }
    return 0;
}
    

 

 


免責聲明!

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



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