·7-18 二分法求多項式單根
代碼如下:
?
#include <stdio.h>
#include <math.h>// 定義多項式函數
double polynomial(double x, double a3, double a2, double a1, double a0) {return a3 * x * x * x + a2 * x * x + a1 * x + a0;
}// 二分法求根函數
double bisection_method(double a3, double a2, double a1, double a0, double a, double b) {double fa = polynomial(a, a3, a2, a1, a0);double fb = polynomial(b, a3, a2, a1, a0);double mid, fmid;const double threshold = 1e-6; // 閾值設為10^-6while (fabs(b - a) >= threshold) {mid = (a + b) / 2;fmid = polynomial(mid, a3, a2, a1, a0);if (fabs(fmid) < threshold) {return mid; // 正好找到根,不用fmid == 0的原因是避免浮點數精度問題導致無法準確判斷零點}if (fa * fmid < 0) { // 根在左半區間b = mid;fb = fmid;} else { // 根在右半區間a = mid;fa = fmid;}}return (a + b) / 2; // 返回區間中點作為近似根
}int main() {double a3, a2, a1, a0;double a, b, root;// 讀取多項式系數scanf("%lf %lf %lf %lf", &a3, &a2, &a1, &a0);// 讀取區間端點scanf("%lf %lf", &a, &b);// 使用二分法求根root = bisection_method(a3, a2, a1, a0, a, b);// 輸出結果,保留2位小數printf("%.2f\n", root);return 0;
}?
代碼說明:
1. 多項式函數:polynomial 函數計算給定x值時多項式的值。
2. 二分法實現:
? ?·?初始化區間端點的函數值
? ?·?循環直到區間長度小于閾值(1e-6)
? ?·?計算中點及其函數值
? ?·?根據中點函數值調整搜索區間
3. 主函數:
? ?·?讀取多項式系數(a3, a2, a1, a0)
? ?·?讀取搜索區間[a, b]
? ?·?調用二分法函數求根
? ?·?輸出結果,保留2位小數
4. 精度控制:
? ?·?使用1e-6作為閾值,確保結果精確
? ?·?輸出時使用%.2f格式保留2位小數
·7-22 龜兔賽跑
?解題思路
1. 初始化變量:設置烏龜和兔子的初始位置為0,時間從0開始。
2. 模擬每分鐘的過程:
? ?·?烏龜每分鐘固定前進3米。
? ?·?兔子每分鐘前進9米,但需要檢查是否滿足休息條件:
? ? ?·?每跑10分鐘,兔子會檢查是否超過烏龜。如果是,則休息30分鐘;否則繼續跑。
? ?·?注意處理兔子的休息狀態,休息期間兔子不移動。
3. 比較結果:根據T分鐘后的距離,輸出勝者或平局。
代碼如下:
#include <stdio.h>int main()
{int T;scanf("%d", &T); // 輸入比賽時間int turtle = 0; // 烏龜跑的距離int rabbit = 0; // 兔子跑的距離int rabbit_rest = 0; // 兔子剩余休息時間int rabbit_run = 0; // 兔子已經跑了多少分鐘(用于判斷是否到10分鐘)for (int t = 1; t <= T; t++) {turtle += 3; // 烏龜每分鐘跑3米if (rabbit_rest > 0) {rabbit_rest--; // 兔子在休息} else {rabbit += 9; // 兔子每分鐘跑9米rabbit_run++;if (rabbit_run == 10){ // 每跑10分鐘檢查一次if (rabbit > turtle) {rabbit_rest = 30; // 休息30分鐘}rabbit_run = 0; // 重置跑步計時}}}// 輸出結果if (turtle > rabbit) {printf("@_@ %d\n", turtle);} else if (rabbit > turtle) {printf("^_^ %d\n", rabbit);} else {printf("-_- %d\n", rabbit);}return 0;
}
代碼說明
1. 輸入處理:讀取比賽時間T。
2. 模擬過程:
? ?·?烏龜每分鐘固定增加3米。
? ?·?兔子每分鐘檢查是否在休息,如果不是,則跑9米,并檢查是否達到10分鐘。如果是,則判斷是否超過烏龜,決定是否休息。
3. 結果輸出:根據T分鐘后的距離,輸出對應的符號和距離。
?注意事項
· 兔子的休息時間是30分鐘,期間不移動。
· 每跑10分鐘,兔子會檢查一次是否超過烏龜,而不是每10分鐘固定休息。
· 輸出符號需嚴格匹配題目要求(`@_@`、`^_^`、`-_-`)。
·7-23 幣值轉換
代碼如下:
#include<stdio.h>
int main()
{int m,flag1 =0,flag2 = -1;/*舉個例子:3600存儲在下面數組中下標:0 1 2 3 4 5 6 7 8單位:億 千萬 百萬 十萬 萬 千 百 十 個值 :0 0 0 0 0 3 6 0 0*///flag1用于標記輸入數據的最高位所在數組的位置(后面會把輸入的數字拆開每一位存入數組,//如果數值比較小,前面就會有很多零,因此要找到第一個不為零的位置從這里開始輸出)//flag2用于標記最后一個非零數字位置(如3600讀作三千六百,后面的兩個零是不輸出的)char u1[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};//存儲0-9代表的字母scanf("%d", &m);//如果輸入值為0,直接輸出0并退出程序即可;if(m == 0){printf("a");exit(0);}int a[9] = {0};//定義一個上面畫的數組char u2[8] = {'Y', 'Q', 'B', 'S', 'W', 'Q', 'B', 'S'};//把單位存下來//獲取各位數字并存到數組中for(int i = 8; i >= 0; i--){a[i] = m % 10;m /= 10;}//尋找最后一個非零數字位置for(int j = 0; j < 9; j++){if(a[j] == 0) flag2 = j - 1;else flag2 = -1;}for(int i = 0; i < 9; i ++){//遍歷到最后一個非零位置直接退出循環if(i == flag2) {break;}//找到第一個不為零的位置,flag變為1,此后就一直是1;if(a[i]! = 0) flag1 = 1;//情況一:該位置數字≠0,這種最簡單,直接輸出對應字母if(flag1 == 1){if(a[i] != 0){printf("%c", u1[a[i]]);}//情況二:對于該位置數字=0,要繼續分多種情況討論else if(a[i] == 0){//情況(1)中間單個0if(a[i-1] != 0 && a[i+1] != 0){//如101這種情況printf("a");continue;//此處continue的原因是不能出現一百零十一,零是沒有單位的}//情況(2)中間有多個零,如10086,else if(a[i-1] == 0 && a[i+1] != 0{ printf("a");}//判斷當前位置是否為中間的最后一個零,只需輸出最后一個零即可//情況(3)中間有多個零但零和它前面的數字組成整體,如100000十萬,第一個零后帶有單位萬else {if(a[i-1] != 0){printf("%c",u2[i]);}//輸出數字對應單位}}//最后正常輸出單位即可,注意最后一個數字無單位,因此不能輸出u2[8];if(i < 8 && a[i] != 0){printf("%c", u2[i]);}}}return 0;
}