🔥博客主頁:小王又困了
📚系列專欄:每日一練
🌟人之為學,不日近則日退?
??感謝大家點贊👍收藏?評論??
?
目錄
一、選擇題
📝1.第一題?
📝2.第二題?
📝3.第三題?
二、編程題
📝1.第一題?
📝2.第二題?
🗒?前言:
在前面我們學習完C語言的所以知識,當然練習鞏固也不能落下。俗話說:“無財之謂貧,學而不能行之謂病。”可見實踐對我們學習的重要。接下來就讓小王帶著大家進行練習,鞏固我們C語言的學習。
一、選擇題
📝1.第一題?
以下程序運行后的輸出結果是( )
int main()
{int a=1,b=2,m=0,n=0,k;k=(n=b<a)&&(m=a);printf("%d,%d\n",k,m);return 0;
}
💡解題思路:
這道題是要打印 k 和 m 的值,我們通過執行上面的表達式來得到它兩的值。在這里括號的優先級最高,先執行括號中的代碼,關系運算符的優先級大于賦值操作符,這里我們要注意 && ,當左邊為假時,就不用執行右邊的代碼。
- 先執行 b<a?為假值為0,再將0賦值給n,表達式結果為零
- 再將0賦值給 k,表達式 k=0表達式為假
- 左側表達式為假,右側表達式也不執行,所以 k 和 m 的值都為0
📝2.第二題?
讀代碼選結果( )
int main()
{int count = 0;int x = -1;while (x){count++;x = x >> 1;}printf("%d", count);
}
?💡解題思路:
通過觀察代碼,可以得知代碼的目是計算一個整數 x 的二進制表示中有多少個1。
- 首先,初始化計數器
count
為0,用于記錄1的個數。- 然后,將整數 x 初始化一個值。接下來進入
while
循環,條件是x
不為0。在循環內部,首先將count
加1,表示找到了一個1。然后將x
右移一位(相當于除以2),繼續檢查新的x
值。當x
變為0時,循環結束。- 最后,使用
printf
函數輸出計數器count
的值,即整數 x 的二進制表示中1的個數。但是這里 x 初始化為-1,-1的二進制補碼全部都是1,第一位是符號位。右移分為算數右移和邏輯右移,一般編譯器都是算術右移:右邊丟棄,左邊補原來的符號位。所以計數器會一直加,程序陷入死循環。
📝3.第三題?
請閱讀以下程序,其運行結果是( )
int main()
{char c='A';if('0' <=c<= '9') { printf("YES");}else {printf("NO");}return 0;
}
?💡解題思路:
這道題很容易對大家產生誤解,'0' <=c<= '9' ,這段代碼的意思就是 c 大于?‘0’小于 ‘9’ 就為真,但這種是數學中的寫法,在程序中這樣的代碼要從左向右執行:
- 先執行 ‘0’<= c,'A' 的ASCII碼值為65,‘0’ 的ASCII碼值為48,‘0’ <=c 為真值為1
- 然后進行下面的判斷 1<= ‘9’ 為真,所以打印YES
正確的代碼應該寫成?c >='0' ?&& c <= '9',if語句判斷為真,打印YES。
雖然兩段代碼的結果相同,但邏輯并不相同,所以我們在平常寫代碼時一定要規范。
二、編程題
📝1.第一題?
💡解題思路:
我們想在數字中添加逗號,將每一位通過 %10 /10 的方式拆分下來,在需要的地方將逗號插入進去。由于加入逗號,原來的數字就不能用整型表示,而是要變成字符型,在得到每位的數據加上 ‘0’ 就可以變成字符型。將得到的數據存放在字符數組中,每存放3個數據就插入一個逗號,即k%3==0 就插入,這里要注意判斷條件,當插入第一個數時,k%3==0 的條件也滿足,但是不需要插入逗號,所以我們要加上 k!=0 ,使條件完整。
#include <stdio.h> int main() {int n = 0;scanf("%d", &n);//存放最后的結果char arr[14] = { 0 };int i = 0;//記錄加逗號int k = 0;while (n){if (k != 0 && k % 3 == 0){arr[i++] = ',';}arr[i++] = n % 10 + '0';n /= 10;k++;}//打印for (i--; i >= 0; i--){printf("%c", arr[i]);}return 0; }
📝2.第二題?
?💡解題思路:
我們通過兩個循環遍歷數組,當找到 numbers[i]+numbers[j] 和目標值相同的直接 return 。由于題目中還要求時間復雜度為 O(nlogn) ,兩次循環時間復雜度為 O(n^2)。所以我們可以使用 contine ,在第二次循環之前先判斷,如果 numbers[i]>target ,兩數之和一定大于 target,使用 continue就可以跳過第二次循環,執行下一次。
- continue:提前結束本次循環,接著執行下一次循環?
?
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize) {int* newarr = (int*)malloc(sizeof(int) * 2);int i = 0;for (i = 0; i < numbersLen; i++){if (numbers[i] > target){continue;}int j = 0;for (j = i + 1; j < numbersLen; j++){if (numbers[i] + numbers[j] == target){newarr[0] = i + 1;newarr[1] = j + 1;*returnSize = 2;return newarr;}}}*returnSize = 0;return 0; }
本次的內容到這里就結束啦。希望大家閱讀完可以有所收獲,同時也感謝各位讀者三連支持。文章有問題可以在評論區留言,博主一定認真認真修改,以后寫出更好的文章。你們的支持就是博主最大的動力。