天天看點

PTA-基礎程式設計題目集

目錄

Function

6-1 簡單輸出整數 (10 分)

6-2 多項式求值 (15 分)

6-3 簡單求和 (10 分)

6-4 求自定類型元素的平均 (10 分)

6-5 求自定類型元素的最大值 (10 分)

6-6 求單連結清單結點的階乘和 (15 分)

6-7 統計某類完全平方數 (20 分)

6-8 簡單階乘計算 (10 分)

6-9 統計個位數字 (15 分)

6-10 階乘計算更新版 (20 分)

6-11 求自定類型元素序列的中位數 (25 分)

6-12 判斷奇偶性 (10 分)

6-13 折半查找 (15 分)

Programming

7-1 厘米換算英尺英寸 (15 分)

7-2 然後是幾點 (15 分)

7-3 逆序的三位數 (10 分)

7-4 BCD解密 (10 分)

7-5 表格輸出 (5 分)

7-6 混合類型資料格式化輸入 (5 分)

7-7 12-24小時制 (15 分)

7-8 超速判斷 (10 分)

7-9 用天平找小球 (10 分)

7-10 計算工資 (15 分)

7-11 分段計算居民水費 (10 分)

7-12 兩個數的簡單電腦 (10 分)

7-13 日K蠟燭圖 (15 分)

7-14 求整數段和 (15 分)

7-15 計算圓周率 (15 分)

7-16 求符合給定條件的整數集 (15 分)

7-17 爬動的蠕蟲 (15 分)

7-18 二分法求多項式單根 (20 分)

7-19 支票面額 (15 分)

7-20 列印九九口訣表 (15 分)

7-21 求特殊方程的正整數解 (15 分)

7-22 龜兔賽跑 (20 分)

7-23 币值轉換 (20 分)

7-24 約分最簡分式 (15 分)

7-25 念數字 (15 分)

7-26 單詞長度 (15 分)

7-27 冒泡法排序 (20 分)

7-28 猴子選大王 (20 分)

7-29 删除字元串中的子串 (20 分)

7-30 字元串的冒泡排序 (20 分)

7-31 字元串循環左移 (20 分)

7-32 說反話-加強版 (20 分)

7-33 有理數加法 (15 分)

7-34 通訊錄的錄入與顯示 (10 分)

7-35 有理數均值 (20 分)

7-36 複數四則運算 (15 分)

7-37 整數分解為若幹項之和 (20 分)

7-38 數列求和-加強版 (20 分)

conclusion

Memory Dot 我的個人部落格,歡迎來玩。

Link: PTA

本題要求實作一個函數,對給定的正整數N,列印從1到N的全部正整數。

思路:

題目很簡單但是試了好多次才通過,原因是把main函數和PrintN一起送出了,

事實上隻用送出自己編寫的PrintN函數就可以了,不用送出main函數。

本題要求實作一個函數,計算階數為n,系數為a[0] ... a[n]的多項式在x點的值。

一開始的思路用了2個for循環,送出後提示複雜度O(n^2)不行。于是,github裡查起答案:x0可以在1個循環裡逐個疊加

本題要求實作一個函數,求給定的N個整數的和。

很簡單的一道題,但是還是送出了幾次。原因是:sum、j必須的賦初值0。PTA裡,系統不會自動指派0。

本題要求實作一個函數,求N個集合元素S[]的平均值,其中集合元素的類型為自定義的ElementType。

被除的N要強制轉換為ElementType,讓結果輸出為浮點數

要額外考慮到max負數的情況,故max初值不能指派0,要指派S[0

本題要求實作一個函數,求單連結清單<code>L</code>結點的階乘和。這裡預設所有結點的值非負,且題目保證結果在<code>int</code>範圍内

一開始運用時,一直在對<code>L-&gt;Data</code>重複指派,導緻這道題思路錯誤。而後,引入<code>num</code>才計算出來。目前會經常忘記<code>return</code>語句,得讓自己多注意。

本題要求實作一個函數,判斷任一給定整數<code>N</code>是否滿足條件:它是完全平方數,又至少有兩位數字相同,如<code>144、676</code>等。

用數組<code>num[10]</code>分别計數<code>0 ~ 9</code>,具體要使用取餘<code>(%10)</code>,除法<code>(/10)</code>來計數、提取數值

其中N是使用者傳入的參數,其值不超過<code>12</code>。如果<code>N</code>是非負整數,則該函數必須傳回<code>N</code>的階乘,否則傳回<code>0</code>。

本題沒有考慮<code>N &gt; 12</code>的情況,即超出32位<code>Tmax</code>的情況。6-10會考慮。

本題要求實作一個函數,可統計任一整數中某個位數出現的次數。例如<code>-21252</code>中,<code>2</code>出現了<code>3</code>次,則該函數應該傳回<code>3</code>。

分類讨論。1、<code>n == 0x80000000</code>、<code>n == 0</code>,注意要使用<code>==</code>等價符号;2、将負數轉為正數處理。

本題要求實作一個列印非負整數階乘的函數。(最大為1000!)

大于<code>9</code>位時,<code>int</code>無法表示,<code>1000!</code>的數值過于巨大,故采用數組<code>Num[3000]</code>表示。簡述:模拟乘法,存儲進位值,根據是否有進位擴充數組。

參考:

Link:參考答案;

本題要求實作一個函數,求<code>N</code>個集合元素<code>A[]</code>的中位數,即序列中第<code>⌊(N+1)/2⌋</code>大的元素。其中集合元素的類型為自定義的<code>ElementType</code>。

使用希爾算法,時間複雜度為<code>O(n^(1.3 ~ 2))</code>。而選擇算法、冒泡算法的時間複雜度為<code>O(n^2)</code>不符合題目時間要求。

Link:希爾算法java實作圖示;參考答案1;參考答案2。

本題要求實作判斷給定整數奇偶性的函數。

n % 2 若有餘數為偶數;若無餘數即0為奇數

給一個嚴格遞增數列,函數int Search_Bin(SSTable T, KeyType k)用來二分地查找k在數列中的位置。

雖然沒學過<code>c++</code>,但此函數幾乎完全用<code>c</code>寫。除了特殊的資料元素表示。簡述:首尾下标相加除以<code>2</code>确定中位數下标<code>mid</code>,然後根據中位數值與首尾數值的大小比較縮小範圍。(此處的中位數不是嚴格意義上的中位數,若<code>start + end</code>為奇數,則會向下取整)

函數部分完成時間:2021.9.22

如果已知英制長度的英尺<code>foot</code>和英寸<code>inch</code>的值,那麼對應的米是<code>(foot+inch/12)×0.3048</code>。現在,如果使用者輸入的是厘米數,那麼對應英制長度的英尺和英寸是多少呢?别忘了<code>1</code>英尺等于<code>12</code>英寸。

思路:<code>int/int</code>直接按<code>float</code>輸出,會輸出<code>0</code>。解決方案:将分子、分母任意一個值改成<code>float</code>。

有時候人們用四位數字表示一個時間,比如<code>1106</code>表示 <code>11</code>點零<code>6</code>分。現在,你的程式要根據起始時間和流逝的時間計算出終止時間。

讀入兩個數字,第一個數字以這樣的四位數字表示目前時間,第二個數字表示分鐘數,計算目前時間經過那麼多分鐘後是幾點,結果也表示為四位數字。當小時為個位數時,沒有前導的零,例如<code>5</code>點<code>30</code>分表示為<code>530</code>;<code>0</code>點 <code>30</code>分表示為<code>030</code>。注意,第二個數字表示的分鐘數可能超過<code>60</code>,也可能是負數。

思路:因為<code>60</code>進制轉化為<code>60</code>的倍數,并且分為<code>h</code>、<code>min</code>兩段輸出,注意要使用<code>%02d</code>。

程式每次讀入一個正<code>3</code>位數,然後輸出按位逆序的數字。注意:當輸入的數字含有結尾的<code>0</code>時,輸出不應帶有前導的<code>0</code>。比如輸入<code>700</code>,輸出應該是<code>7</code>。

思路:用取餘、除法取個、十、百位并單獨讨論十位、百位都為<code>0</code>;百位為<code>0</code>的情況。并列輸出是解決這類題的好方法

<code>BCD數</code>是用一個位元組來表達兩位十進制的數,每四個比特表示一位。是以如果一個<code>BCD數</code>的十六進制是<code>0x12</code>,它表達的就是十進制的<code>12</code>。但是小明沒學過<code>BCD</code>,把所有的<code>BCD數</code>都當作二進制數轉換成十進制輸出了。于是<code>BCD</code>的<code>0x12</code>被輸出成了十進制的<code>18</code>了!

現在,你的程式要讀入這個錯誤的十進制數,然後輸出正确的十進制數。提示:你可以把<code>18</code>轉換回<code>0x12</code>,然後再轉換回<code>12</code>。

思路:用位級運算取個、十位,再單獨處理十位為<code>0</code>的情況(因為最終是并列輸出,防止輸出兩個<code>0</code>)。位級運算有時确實比數級運算友善。

本題要求編寫程式,按照規定格式輸出表格。

思路:注意最後一行無需用<code>\n</code>換行

本題要求編寫程式,順序讀入浮點數1、整數、字元、浮點數2,再按照字元、整數、浮點數1、浮點數2的順序輸出。

思路:<code>scanf()</code>不支援帶點的格式寫法,可以有長度限制,但不可以有小數位數限制。

編寫一個程式,要求使用者輸入24小時制的時間,然後顯示12小時制的時間。

思路:注意題目并不要求将<code>0</code>輸出成<code>00</code>(其實我覺得這樣更好看)

模拟交通警察的雷達測速儀。輸入汽車速度,如果速度超出60 mph,則顯示“Speeding”,否則顯示“OK”。

思路:題目是超出<code>60</code>,暗示着不包括<code>60</code>。

三個球A、B、C,大小形狀相同且其中有一個球與其他球重量不同。要求找出這個不一樣的球。

思路:the ansewer need the output is <code>char</code> but not <code>int</code>.

某公司員工的工資計算方法如下:一周内工作時間不超過40小時,按正常工作時間計酬;超出40小時的工作時間部分,按正常工作時間報酬的1.5倍計酬。員工按進公司時間分為新職工和老職工,進公司不少于5年的員工為老職工,5年以下的為新職工。新職工的正常工資為30元/小時,老職工的正常工資為50元/小時。請按該計酬方式計算員工的工資。

思路:<code>int * int</code> also <code>int</code>, therefore, set to <code>int * float</code> in order to make <code>flaot</code>.

為鼓勵居民節約用水,自來水公司采取按用水量階梯式計價的辦法,居民應交水費y(元)與月用水量x(噸)相關:當x不超過15噸時,y=4x/3;超過後,y=2.5x−17.5。請編寫程式實作水費的計算。

思路:the input is <code>float</code>.

本題要求編寫一個簡單電腦程式,可根據輸入的運算符,對2個整數進行加、減、乘、除或求餘運算。題目保證輸入和輸出均不超過整型範圍。

思路:easy.

股票價格漲跌趨勢,常用蠟燭圖技術中的K線圖來表示,分為按日的日K線、按周的周K線、按月的月K線等。以日K線為例,每天股票價格從開盤到收盤走完一天,對應一根蠟燭小圖,要表示四個價格:開盤價格Open(早上剛剛開始開盤買賣成交的第1筆價格)、收盤價格Close(下午收盤時最後一筆成交的價格)、中間的最高價High和最低價Low。

如果Close&lt;Open,表示為“BW-Solid”(即“實心藍白蠟燭”);如果Close&gt;Open,表示為“R-Hollow”(即“空心紅蠟燭”);如果Open等于Close,則為“R-Cross”(即“十字紅蠟燭”)。如果Low比Open和Close低,稱為“Lower Shadow”(即“有下影線”),如果High比Open和Close高,稱為“Upper Shadow”(即“有上影線”)。請程式設計式,根據給定的四個價格組合,判斷當日的蠟燭是一根什麼樣的蠟燭。

思路:compare quantity of condition, lots quantity at first and low quantity at second and so on.

給定兩個整數A和B,輸出從A到B的所有整數以及這些數的和。

思路:if <code>B - A &lt;= 4</code>, not have a newline.

根據下面關系式,求圓周率的值,直到最後一項的值小于給定門檻值。

<code>π / 2 = 1 + 1/3 + 2!/3*5 + 3!/3*5*7 + ... + n!/3*5*7*...*(2n+1)</code>

思路:Attention to <code>0!</code> equal <code>1!</code>, so set <code>PI = 1</code>(First iteam) and set <code>last = up / down = 1 / 3</code>(Second iteam) at beginning.

給定不超過6的正整數A,考慮從A開始的連續4個數字。請輸出所有由它們組成的無重複數字的3位數。

思路:<code>i,j,k</code>按遞增順序分别對應四個數,第二個for保證<code>j != i</code>,第三個for保證<code>k != i &amp;&amp; k != j</code>。

它們都是按遞增順序比較是否相等之後再輸出,保證了輸出是遞增的。

在輸出的每一行中,第一個for調用一次,第二個for将調用四次,第三個for将調用十八次。

一條蠕蟲長1寸,在一口深為N寸的井的底部。已知蠕蟲每1分鐘可以向上爬U寸,但必須休息1分鐘才能接着往上爬。在休息的過程中,蠕蟲又下滑了D寸。就這樣,上爬和下滑重複進行。請問,蠕蟲需要多長時間才能爬出井?

這裡要求不足1分鐘按1分鐘計,并且假定隻要在某次上爬過程中蠕蟲的頭部到達了井的頂部,那麼蠕蟲就完成任務了。初始時,蠕蟲是趴在井底的(即高度為0)。

思路:完全依照題意進行程式設計,重點是運用了增量這個概念,對時間進行遞增,對位置進行遞增和遞減。

二分法求函數根的原理為:如果連續函數f(x)在區間[a,b]的兩個端點取值異号,即f(a)f(b)&lt;0,則它在這個區間内至少存在1個根r,即f(r)=0。

thoughts:

try to submit array address to func, but <code>segmentation fault</code>.

try to use <code>double pow(double x , double n)</code> , but also <code>segmentation fault</code>.

x and y have the same sign equal <code>x*y &gt; 0</code>.

forget <code>&amp;</code> again...when I no pay attention to it.

<code>mid != func_mid</code>! ! ! !

一個采購員去銀行兌換一張y元f分的支票,結果出納員錯給了f元y分。采購員用去了n分之後才發覺有錯,于是清點了餘額尚有2y元2f分,問該支票面額是多少?

思路:完全依照題意進行程式設計,思路上按照題意來,然後逐個解決。我是将輸出結果看成四位數,然後分别取前兩位,後兩位。<code>f*100 + y - n == 2*y*100 + 2*f</code>其實是對“結果出納員錯給了f元y分。采購員用去了n分之後才發覺有錯,于是清點了餘額尚有2y元2f分”的數學表示。注意,<code>return 0</code>可以不止寫一條,隻要滿足要求。

下面是一個完整的的下三角九九口訣表:

本題要求對任意給定的一位正整數<code>N</code>,輸出從<code>1*1</code>到<code>N*N</code>的部分口訣表。

思路:注意輸出格式,左對齊,等式右端包括數值一共占<code>4</code>位。

本題要求對任意給定的正整數N,求方程X2+*Y*2=N的全部正整數解。

思路:個人解法中,使用數組使得<code>x&lt;=y</code>,但過于繁瑣了,不如參考解法中的i,j共同周遊,滿足<code>i &lt; j</code>即可。同時需要注意到題目要求是正整數求解,也就是說不包括<code>0</code>和負數。

烏龜與兔子進行賽跑,跑場是一個矩型跑道,跑道邊可以随地進行休息。烏龜每分鐘可以前進3米,兔子每分鐘前進9米;兔子嫌烏龜跑得慢,覺得肯定能跑赢烏龜,于是,每跑10分鐘回頭看一下烏龜,若發現自己超過烏龜,就在路邊休息,每次休息30分鐘,否則繼續跑10分鐘;而烏龜非常努力,一直跑,不休息。假定烏龜與兔子在同一起點同一時刻開始起跑,請問T分鐘後烏龜和兔子誰跑得快?

thought:learn using countdown design.

輸入一個整數(位數不超過9位)代表一個人民币值(機關為元),請轉換成财務要求的大寫中文格式。如23108元,轉換後變成“貳萬叁仟壹百零捌”元。為了簡化輸出,用小寫英文字母a-j順序代表大寫數字0-9,用S、B、Q、W、Y分别代表拾、百、仟、萬、億。于是23108元應被轉換輸出為“cWdQbBai”元。

思路:從最低位分解數字,之後要考慮中間連續為0時,是否有過萬。

分數可以表示為<code>分子/分母</code>的形式。編寫一個程式,要求使用者輸入一個分數,然後将其約分為最簡分式。最簡分式是指分子和分母不具有可以約分的成分了。如6/12可以被約分為1/2。當分子大于分母時,不需要表達為整數又分數的形式,即11/8還是11/8;而當分子分母相等時,仍然表達為1/1的分數形式。

though: traveral <code>1 ~ x_max</code> to find <code>com_fac_max</code>(maxinum of common factor).

還找到了一個簡潔優雅的遞歸函數來求最大公因數:

輸入一個整數,輸出每個數字對應的拼音。當整數為負數時,先輸出<code>fu</code>字。十個數字對應的拼音如下:

AC代碼:

思路:不斷分割輸入的整數,但注意for循環結束後的i,比所需的cut[i]的i值多了1,需要減去。同時輸出時是按i值降序(從大到小)輸出的。

你的程式要讀入一行文本,其中以空格分隔為若幹個單詞,以<code>.</code>結束。你要輸出每個單詞的長度。這裡的單詞與語言無關,可以包括各種符号,比如<code>it's</code>算一個單詞,長度為4。注意,行中可能出現連續的空格;最後的<code>.</code>不計算在内。

ideas:

Before counting, we must set(reset) <code>count</code> and the first <code>c</code>.

The format of output are one numbers: <code>%d</code> or some numbers: <code>%d %d %d %d</code>, so we must set <code>flag</code>.

将N個整數按從小到大排序的冒泡排序法是這樣工作的:從頭到尾比較相鄰兩個元素,如果前面的元素大于其緊随的後面元素,則交換它們。通過一遍掃描,則最後一個元素必定是最大的元素。然後用同樣的方法對前N−1個元素進行第二遍掃描。依此類推,最後隻需處理兩個元素,就完成了對N個數的排序。

本題要求對任意給定的K(&lt;N),輸出掃描完第K遍後的中間結果數列。

輸入格式:

輸入在第1行中給出N和K(1≤K&lt;N≤100),在第2行中給出N個待排序的整數,數字間以空格分隔。

輸出格式:

在一行中輸出冒泡排序法掃描完第K遍後的中間結果數列,數字間以空格分隔,但末尾不得有多餘空格。

輸入樣例:

輸出樣例:

AC code:

Begain using <code>debug</code>;

<code>contiune</code> running of models;

<code>step over</code> running of ''one by one''("line by line");

<code>step into</code> into this function, and then do this function of ''one by one'';

<code>step out</code> leave this function.

一群猴子要選新猴王。新猴王的選擇方法是:讓N隻候選猴子圍成一圈,從某位置起順序編号為1~N号。從第1号開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接着又從緊鄰的下一隻猴子開始同樣的報數。如此不斷循環,最後剩下的一隻猴子就選為猴王。請問是原來第幾号猴子當選猴王?

思路:引入兩個計數變量,第一個變量作為淘汰變量,每數到3淘汰一個,重新計數; 第二個變量作為剩餘變量,記錄剩餘猴子數,每淘汰一個減少1,當剩餘變量為1時,結束。

輸入2個字元串S1和S2,要求删除字元串S1中出現的所有子串S2,即結果字元串中不能包含S2。

解答二:利用string.h庫中的字元串函數解決 提示:在 C 語言中,字元串實際上是使用字元 <code>\0</code> 終止的一維字元數組。 先來介紹要用到的字元串函數: 1、char *strstr( const char *str1, const char *str2 ); 功能:用于判斷字元串str2是否是str1的子串。如果是,則該函數傳回 str1字元串從 str2第一次出現的位置開始到 str1結尾的字元串;否則,傳回NULL。 2、char *strcpy( char *str1, const char *str2 ); 功能:複制,把從str2位址開始且含有NULL結束符的字元串複制到以str1開始的位址空間 3、char *strcat( char *str1, const char *str2 ); 功能:拼接,把str2所指向的字元串(包括<code>\0</code>)複制到str1所指向的字元串後面(删除str1原來末尾的<code>\0</code>)。注意要保證str1足夠長,以容納被複制進來的*str2。 注意:以上兩個函數(strcpy,strcat)中str1和str2所指記憶體區域不可以重疊且str1必須有足夠的空間來容納str2的字元串。是以代碼中定義了一個臨時數組。

解法參考連結;字元串函數參考連結;c語言NULL和0差別及NULL詳解

我們已經知道了将N個整數按從小到大排序的冒泡排序法(7-27)。本題要求将此方法用于字元串序列,并對任意給定的K(&lt;N),輸出掃描完第K遍後的中間結果序列。

介紹string.h中的字元串函數: char *strcpy( char *str1, const char *str2 ); int *strcmp( char *str1, const char *str2 ); 用于比較兩個字元串并根據比較結果傳回整數。若str1=str2,則傳回零;若str1&lt;str2,則傳回負數;若str1&gt;str2,則傳回正數。

字元串函數參考連結;c語言NULL和0差別及NULL詳解

輸入一個字元串和一個非負整數N,要求将字元串循環左移N次。

輸入在第1行中給出一個不超過100個字元長度的、以回車結束的非空字元串;第2行給出非負整數N。

在一行中輸出循環左移N次後的字元串。

思路:又學習了兩個字元串函數;參考了<code>7-29</code>,但是要差別這是循環左移;最後發現puts()函數會導緻段錯誤。

char *strncpy( char *str1, const char *str2, int n ); 功能:複制,把從str2位址開始且含有NULL結束符的前n個字元串複制到以str1開始的位址空間 char strncat( char *str1, const char *str2, int n ); 功能:拼接,把str2所指向的字元串的前n個字元(再加一個<code>\0</code>)複制到str1所指向的字元串後面(删除str1原來末尾的<code>\0</code>)。注意要保證str1足夠長,以容納被複制進來的str2

給定一句英語,要求你編寫程式,将句中所有單詞的順序颠倒輸出。

測試輸入包含一個測試用例,在一行内給出總長度不超過500 000的字元串。字元串由若幹單詞和若幹空格組成,其中單詞是由英文字母(大小寫有區分)組成的字元串,單詞之間用若幹個空格分開。

每個測試用例的輸出占一行,輸出倒序後的句子,并且保證單詞間隻有1個空格。

AC code:

思路:多使用标記,如<code>flag, count</code>。Reference Linking

本題要求編寫程式,計算兩個有理數的和。

輸入在一行中按照<code>a1/b1 a2/b2</code>的格式給出兩個分數形式的有理數,其中分子和分母全是整形範圍内的正整數。

在一行中按照<code>a/b</code>的格式輸出兩個有理數的和。注意必須是該有理數的最簡分數形式,若分母為1,則隻輸出分子。

輸入樣例1:

輸出樣例1:

輸入樣例2:

輸出樣例2:

idea: refer to [7-24 約分最簡分式 ](# 7-24 約分最簡分式 (15 分))

ps: Recently, I will spend a lot of time preparing for CET6.

通訊錄中的一條記錄包含下述基本資訊:朋友的姓名、出生日期、性别、固定電話号碼、行動電話号碼。 本題要求編寫程式,錄入N條記錄,并且根據要求顯示任意某條記錄。

輸入在第一行給出正整數N(≤10);随後N行,每行按照格式<code>姓名 生日 性别 固話 手機</code>給出一條記錄。其中<code>姓名</code>是不超過10個字元、不包含空格的非空字元串;生日按<code>yyyy/mm/dd</code>的格式給出年月日;性别用<code>M</code>表示“男”、<code>F</code>表示“女”;<code>固話</code>和<code>手機</code>均為不超過15位的連續數字,前面有可能出現<code>+</code>。

在通訊錄記錄輸入完成後,最後一行給出正整數K,并且随後給出K個整數,表示要查詢的記錄編号(從0到N−1順序編号)。數字間以空格分隔。

對每一條要查詢的記錄編号,在一行中按照<code>姓名 固話 手機 性别 生日</code>的格式輸出該記錄。若要查詢的記錄不存在,則輸出<code>Not Found</code>。

idea: use <code>struct</code> array and string <code>%s</code>.

日期:21.11.8

本題要求編寫程式,計算N個有理數的平均值。

輸入第一行給出正整數N(≤100);第二行中按照<code>a1/b1 a2/b2 …</code>的格式給出N個分數形式的有理數,其中分子和分母全是整形範圍内的整數;如果是負數,則負号一定出現在最前面。

在一行中按照<code>a/b</code>的格式輸出N個有理數的平均值。注意必須是該有理數的最簡分數形式,若分母為1,則隻輸出分子。

主要是求多個分母的最小公約數那一塊,要考慮到隻有一個數、隻有兩個數的邊界情況。本質上還是用for循環一個個找,使得能夠兩兩被整除。

報錯提示:“若不随時化簡,則會溢出”,告訴我們要考慮到分子求和可能會溢出的情況,是以每輸入一次就化簡一次。

<code>gcd(int x, int y)</code>仍舊源自 [7-24 約分最簡分式 ](# 7-24 約分最簡分式 (15 分))

日期:21.11.22

本題要求編寫程式,計算2個複數的和、差、積、商。

輸入在一行中按照<code>a1 b1 a2 b2</code>的格式給出2個複數C1=<code>a1+b1i</code>和C2=<code>a2+b2i</code>的實部和虛部。題目保證C2不為0。

分别在4行中按照<code>(a1+b1i) 運算符 (a2+b2i) = 結果</code>的格式順序輸出2個複數的和、差、積、商,數字精确到小數點後1位。如果結果的實部或者虛部為0,則不輸出。如果結果為0,則輸出0.0。

先計算再四舍五入最後才輸出(保留一位小數),注意四舍五入要區分正負數。

複數乘法、除法采用數學公式即可

等号左右式子的格式都需要用<code>if</code>語句區分情況。

參考連結

21.12.20

将一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。程式設計求出正整數N的所有整數分解式子。

每個輸入包含一個測試用例,即正整數N (0&lt;N≤30)。

按遞增順序輸出N的所有整數分解式子。遞增順序是指:對于兩個分解序列N1={n1,n2,⋯}和N2={m1,m2,⋯},若存在i使得n1=m1,⋯,ni=mi,但是ni+1&lt;mi+1,則N1序列必定在N*2序列之前輸出。每個式子由小到大相加,式子間用分号隔開,且每輸出4個式子後換行。

如圖所示,以<code>N = 3</code>為例子,可以看到,一開始拆分項全都為1,而後從最後一項 <code>i== 2</code>開始變化,執行這一次的for循環。總共3個黑框代表3個for循環。最後退出循環是因為隻有一個division,沒有遞歸直接return回<code>main</code>。

PTA-基礎程式設計題目集

日期:

21.12.21

給定某數字A(1≤A≤9)以及非負整數N(0≤N≤100000),求數列之和S=A+AA+AAA+⋯+AA⋯A(N個A)。例如A=1, N=3時,S=1+11+111=123。

輸入數字A與非負整數N。

輸出其N項數列之和S的值。

雙長整型也無法儲存<code>100,000</code>個數值,是以用動态數組指針

<code>A = 0,N = 0</code> 是特殊情況,單獨處理

以計算<code>A = 9,N = 4</code> 為例,計算:<code>9 + 99 + 999 +9,999 = 11,106</code>

個位:<code>num[0] = 9 * 4 % 10 = A * N % 10 = 6</code>

個位的進位為<code>carry = (9 * 4 ) / 10 = 3</code>

十位:<code>num[1] = (9 * 3 % 10 + 3) % 10 = (A * (N - 1) % 10 + carry) % 10 = 0</code>

十位的進位為<code>carry = (9 * 3 + 3) / 10 = 3</code>

百位:<code>num[2] = (9 * 2 % 10 + 3) % 10= (A * (N - 2) % 10 + carry) % 10 = 1</code>

百位的進位為<code>carry = (9 * 2 + 3) / 10 = 2</code>

千位:<code>num[3] = (9 * 1 % 10 + 2 ) % 10= (A * (N - 3) % 10 + carry) % 10 = 1</code>

千位的進位為<code>carry = (9 * 1 + 2) / 10 = 1</code>

萬位:<code>num[4] = 1</code>

可見滿足規律:

<code>num[i] = (A * (N - i) % 10 + carry) % 10</code> 和 <code>carry = (A * (N - i) + carry) / 10</code>

結果必為N位或者N+1位數,其中如果有N+1位數其數值必為1。

完結了呀

熟悉了c的很多基本操作

期間因為參加六級考試和做csapp的實驗,斷了一個月的訓練時間,不過還是搞定了

是一段艱苦的旅程,但還是很愉快地學到許多技巧

最近在聽佐藤直紀的《異邦人の刃》和《空の涯まで》,以及五月天的《有些事現在不做 一輩子都不會做了》,推薦給你們

c