🔥個人主頁:艾莉絲努力練劍
?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C++基礎知識知識強化補充、C/C++干貨分享&學習過程記錄
🍉學習方向:C/C++方向
??人生格言:為天地立心,為生民立命,為往圣繼絕學,為萬世開太平
前言:距離學完C語言已經過去一段時間了,在學習了初階的數據結構之后,博主要更新的內容是C語言16天強化訓練,之前博主更新過一個【C語言刷題12天IO強訓】的專欄,那個是從入門到進階的IO模式真題的訓練。今天依然是訓練五道選擇題和兩道編程算法題,希望大家能夠有所收獲!
目錄
正文
一、五道選擇題
1.1? 題目1
1.2? 題目2
1.3? 題目3
1.4? 題目4
1.5? 題目5
二、兩道算法題
2.1??尼科徹斯定理
題目理解:
2.2??等差數列
題目理解:
結尾
正文
一、五道選擇題
1.1? 題目1
題干:以下程序段的輸出結果是( )
#include<stdio.h>
int main()
{char s[] = "\\123456\123456\t";printf("%d\n", strlen(s));return 0;
}
A. 12? ? ?B. 13? ? ?C. 16? ? ?D. 以上都不對
解析:主要注意以下這幾個點——
(1)\\?是一個轉義字符,表示一個反斜\字符;
(2)\123(\ddd)是一個八進制轉義字符,\123表示ASCII碼值為83的字符('S');
(3)\t?是一個轉義字符,“tab對齊”,表示制表符。
這樣一來實際上就只有\ddd,1,2,3,4,5,6,S,4,5,6,\t 這12個字符啦。
1.2? 題目2
題干:若有以下程序,則運行后的輸出結果是( )
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{printf("%d\n", NUM);return 0;
}
A. 4? ? ? B. 8? ? ? C. 9? ? ? D. 6
解析:這道題非常簡單,我們之間展開宏,宏展開后為((N+1)+1)*(N+1)/2,我們再代入N=2,我們得到((2+1)+1)*(2+1)/2,即D。
1.3? 題目3
題干:如下函數的 f(1) 的值為( )
int f(int n)
{static int i = 1;if(n >= 5)return n;n = n + i;i++;return f(n);
}
A. 5? ? ?B. 6? ? ?C. 7? ? ?D. 8
解析:這道題中的遞歸過程是f(1)->f(2)->f(4)->f(7),當n=7的時候,滿足n>=5,返回7。
因為每次n=n+i,i++,在函數遞歸調用f(n),最終結果就是返回7。static int i 在遞歸過程中會持續累加(每次調用i++),遞歸終止條件是n >= 5,最后一次返回的是n = 7。選擇C。
1.4? 題目4
題干:下面3段程序代碼的效果一樣嗎( )
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A. (2)=(3)? ? ?B. (1)=(2)? ? ?C. 都不一樣? ? ?D. 都一樣
解析:(1)const int *a = &b;和(2)int const *a = &b;等價,即指針指向的int是常量;而(3)int *const a = &b;是指針本身變成了常量,兩者效果不一樣。即一個選擇B. (1)=(2)。?
1.5? 題目5
題干:對于下面的說法,正確的是( )
A. 對于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B. 對于某個double變量 a,可以使用 a == 0.0 來判斷其是否為零
C. 初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同
D. 以上說法都不對
解析:A選項錯誤——結構體有內存對齊,B選項錯誤——浮點數直接比較不精確,C選項錯誤——數組不能直接賦值字符串,排除法,我們選擇D. 以上說法都不對。
選擇題答案如下:
1.1? A
1.2? D
1.3? C
1.4? B
1.5? D
大家都做對了嗎?
二、兩道算法題
2.1??尼科徹斯定理
題目鏈接:HJ76 尼科徹斯定理
題目描述:
題目理解:
對任意正整數?n,輸出由?n 個連續奇數組成的數列,其和等于?n?的立方。數列元素用加號連接。
這道題也是IO型的,下面是C語言的模版(IO型就不用管它們了)——
代碼演示:
#include <stdio.h>int main()
{int n;scanf("%d", &n);int start = n * n - n + 1; // 計算起始奇數for (int i = 0; i < n; i++) {printf("%d", start + 2 * i); // 輸出當前奇數if (i < n - 1) {printf("+"); // 非最后一個元素時輸出加號}}printf("\n");return 0;
}
這道題是C語言中一道比較經典的題目。
時間復雜度:O(n);
空間復雜度:O(1)。
我們如果學習了C++也可以嘗試用C++實現一下——
#include <iostream>
using namespace std;int main()
{int n;while (cin >> n) { // 處理多組輸入int start = n * n - n + 1; // 計算起始奇數for (int i = 0; i < n; i++) {cout << start + 2 * i; // 輸出當前奇數if (i < n - 1) {cout << "+"; // 非最后一個元素時輸出加號}}cout << endl; // 這里要記得換行}return 0;
}
時間復雜度:O(n),空間復雜度:O(1)。
這個目前要寫出來非常考驗C++的學習情況,大家可以嘗試去寫一寫,優先掌握C語言的寫法,博主還沒有介紹C++的算法題,之后會涉及的,敬請期待!
2.2??等差數列
題目鏈接:HJ100 等差數列
題目描述:
題目理解:
本題就是要求計算首項為2,公差為3的等差數列前n項的和。
這道題也是IO型的,下面是C語言的模版(IO型就不用管它們了)——
代碼演示:
#include <stdio.h>int main()
{int n;scanf("%d", &n);int sum = n * (2 * 2 + (n - 1) * 3) / 2; // 等差數列求和公式printf("%d\n", sum);return 0;
}
這道題是C語言中一道比較經典的題目。
當然博主還有一個更加簡單的解法,這個解法大家理解起來就簡單了——
#include <stdio.h>int main()
{int n = 0;scanf("%d", &n);int Sn = n * (2 + 3 * n - 1) / 2;printf("%d", Sn);return 0;
}
我們如果學習了C++也可以嘗試用C++實現一下——
#include <iostream>
using namespace std;int main()
{int n;while (cin >> n) { // 處理多組輸入int sum = n * (2 * 2 + (n - 1) * 3) / 2; // 等差數列求和公式cout << sum << endl;}return 0;
}
時間復雜度:O(1);
空間復雜度:O(1)。
目前要寫出來C++的寫法是比較考驗前面C++的學習情況的,當然大家可以嘗試去寫一寫,優先掌握C語言的寫法,博主還沒有介紹C++的算法題,之后會涉及的,敬請期待!
結尾
往期回顧:
【C語言16天強化訓練】從基礎入門到進階:Day 1
結語:感謝大家的閱讀,記得給博主“一鍵四連”,感謝友友們的支持和鼓勵!