PTA刷题小结(basic篇)

本文介绍了在解决PTA题目中遇到的关于C++的超大整数运算和逆向迭代器的问题。通过实例分析了如何处理自然数的各位数字之和,并讲解了逆向迭代器的逻辑与物理位置的关系,强调了在VS环境下使用输入输出流代替`scanf`的建议,以及结构体和类的区别以及字符串常量的修改方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Basic 1002
题目:读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10的100次方
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

知识点:
1.超大整数运算 将整数先读成str然后操作后再转回来。(此题其实不用,因为不涉及超大整数的加减乘除)

for (auto ch : num)//ch依次取的是str里面的字符,直到取完为止 c++11,新式for循环
		{
			big_num[i-1] = (ch - '0');//从末尾开始取 ch-'0'转化为int
			--i;
		}
		for (i = 0; i < num.size(); ++i) 		
			sum += big_num[i];

2.关于逆向迭代器
一个容器的范围用普通迭代器表示为一个“半开半闭”的区间。头部为begin,指向容器第一个元素的位置。末尾为end,指向最后一个元素的下一个位置,每个容器都提供了这样一个位置,尽管该位置不可引用,但却是个合法的地址。相反,第一个元素位置的前一个位置容器却没有任何保证,比如对于vector和string来说,就是非法的位置。这里我们说“合法”与“非法”,简单来讲,可以这样认为,一个合法的位置对于迭代器来说是可以达到的,像最后一个元素的下一个位置end()。而对于首元素的前一个位置,迭代器是无法指向它的,begin()-1这个表达式会导致异常。因此,反向迭代器与普通迭代器在物理位置上保持了一一对应,即rbegin()对应普通迭代器的end()位置,rend()对应其begin()位置。
但是,为了让反向迭代器与普通迭代器在概念上保持一致性,即begin()(反向迭代器对应为rbegin())对应第一个元素(对于反向迭代器来说,最后一个元素即第一个元素),end()(反向迭代器对应为rend())对应最后一个元素的下一个位置,于是标准库的设计者们想出这样一个方法,即反向迭代器的逻辑位置等于其物理位置的前一个位置。换句话说,物理位置对应迭代器在内存中的实际位置,逻辑位置对应迭代器对应容器中元素的位置。这样,对于rbegin()来说,它物理位置是容器最后一个元素的下一个位置,逻辑位置即容器最后一个元素的位置(对反向迭代器来说就是第一个元素元素的位置),同理rend()物理位置为容器第一个元素位置,逻辑位置即第一个位置的前一个位置(依然不可解引用)。这样,反向迭代器与普通迭代器便有了一致的概念,即“半开半闭”区间。更为直观的演示如下图

在这里插入图片描述
注意逆向迭代器的递增是向着物理位置的“前方”的,即地址前大后小。用rit++来逆向迭代。

Basic 1004
注意事项:
1.在VS上,scanf疯狂报错,情况未知。多用输入输出流替代。
2.结构体struct在c++中与class并无分别,前者的函数默认是public,后者的函数默认是private。
3.形如char[15]的字符串是常量,是不可直接复制修改的左值,如果要修改要用strcpy函数修改。

//e.g.
struct student
	{
		char name[15];
		char num[15];
		int grade;
	};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值