- 高精度小數(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
// 多項式加法 #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
題目所給的數據保證了不會出現多個鞍點。
輸入樣例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
輸出樣例:
2 1
// 鞍點 #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
// 單詞長度 #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; }
