正整数 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";//正确
而字符数组存储在栈或者堆上分配的内存,因此可以修改。