【PAT B1016】部分A+B

正整数 A 的“DA​(为 1 位整数)部分”定义为由 A 中所有 DA​ 组成的新整数 PA​。例如:给定 A=3862767,DA​=6,则 A 的“6 部分”PA​ 是 66,因为 A 中有 2 个 6。

现给定 A、DA​、B、DB​,请编写程序计算 PA​+PB​。

输入格式:

输入在一行中依次给出 A、DA​、B、DB​,中间以空格分隔,其中 0<A,B<109。

输出格式:

在一行中输出 PA​+PB​ 的值。

输入样例 1:

3862767 6 13530293 3

输出样例 1:

399

输入样例 2:

3862767 1 13530293 8

输出样例 2:

0

 题目分析:

        本题首先应获取整数的某一位,获得该位的数量,再进行加法运算

知识:

        数组:

                定义和初始化

                        数组的声明形如a[d],a是数组的名字,d是数组的维度,维度必须是常量表达式

int arr[10];

                显式初始化数组元素

                        可以对元素进行列表初始化,此时允许忽略数组的维度,如果声明时没有指明维度,编译器会根据初始值的计算推断出来,相反,如果指明了维度,那么初始值的总数量不应该超出指定的大小。如果维度比提供的初始值数量要大,则用提供的初始值初始化靠前的元素,剩下的元素初始化为默认值。

int a1[]={0,1,2};   //含有3个元素的数组
int a2[]={0,1,2};   //等价于a2[]={0,1,2,0,0};
string a3[]={"hello","world"} //等价于a3={"hello","world"," "};

                        字符数组的特殊性

char a1[]="c++";//自动添加表示字符串结束的空字符

               访问数组元素

                        数组下标被定义为size_t类型,以包含10个元素的数组为例,索引从0-9.

评测:

#include <iostream>
#include <string>
using namespace std;

long long result(const char* num, int D) {  //函数定义为longlong类型,由于 0<A,B<10^9,如果A,B中全是那个数就int类型就表示不了
	const char* p = num; //p初始化为num,都是指向常量字符的指针,意为不能通过该指针改变字符的值,通过p来遍历访问A,B的每一个字符,num始终指向字符串初始位置
	string P;
	while (*p) {  //如果*p不指向\0
		if (*p - '0' == D) { //相减返回整数类型的数字
			P += *p; //加入字符串P中
		}
		p++; //访问下一个字符
	}
	if (P.empty()) { //如果字符串是空的,即整数中A\B中不存在D
		return 0;  //返回0
	}
	return stoll(P);//stoll函数,string to long long;

}
int main() {
	char A[11], B[11];
	int Da, Db;
	cin >> A >> Da;
	cin >> B >> Db;
	long long Pa = result(A, Da);
	long long Pb = result(B, Db);
	cout << Pa + Pb;
	return 0;
}

结果:

       

 总结

主要采用了数组+指针的方法,用了string库中的empty和stoll函数

对于char类型的数组,以下情况可以自动转化为指向数组起始位置的指针(const防止意外修改)

char a[5]="abcd";
const char *P=a;
result(A,Pa);//作为函数参量传递

 值得一提的是

int main() {
	char* p = "1234";
	return 0;
};

char类型的指针不能指向字符串常量

int main() {
	char A[100] = "1234";
	char* p = A;
	return 0;
};

却可以指向字符数组

原因是字符串常量是存储在内存只读区域的,不可修改,试图通过char*修改这些常量会导致未定义问题,应该使用const char*指向这些常量

char *p = "abc";//error,导致未定义行为
const char *p="abc";//正确

而字符数组存储在栈或者堆上分配的内存,因此可以修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值