天天看点

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