字符串提取数字求和⭐
题目描述(题目难度⭐)
输入两个字符串,分别将它们中的数字分离出来,前置0自行省略,(例如:0d1a5a3分离数字后为153)。若没有数字,则分离结果为0。 请输出两个字符串分离出的两个非负整数相加的结果(数据保证输出的结果在int数据类型的范围之内)。
输入
输入两个字符串,数据保证字符串长度不超过1000且仅包含数字和字母两种类型的字符。
输出
输出从两个字符串中分离出的两个非负整数相加后的结果。
本题思路:从两个字符串中提取数字字符,将这些数字字符转换为整数,然后将这两个整数相加并输出结果。
代码思路
-
读取输入:
- 使用
scanf
读取两个字符串str1
和str2
,字符串长度不超过1000。
- 使用
-
提取数字:
- 使用两个
for
循环分别遍历str1
和str2
,检查每个字符是否为数字。 - 如果字符是数字,将其转换为整数并存储到数组
arr1
和arr2
中,同时记录数组的长度a1
和a2
。
- 使用两个
-
反转数组:
- 调用
reverse
函数反转数组arr1
和arr2
,以便去除前导零。
- 调用
-
去除前导零:
- 使用
while
循环从数组的末尾开始,去除前导零,更新数组的长度a1
和a2
。
- 使用
-
转换为整数:
- 使用两个
for
循环将数组arr1
和arr2
中的数字字符转换为整数aa1
和aa2
。 - 每个数字字符乘以相应的权值(10的幂)并累加到
aa1
和aa2
中。 - 输出结果:
- 使用两个
- 输出两个整数的和
aa1 + aa2
。
详细代码(C语言)
#include<stdio.h>
#include<string.h>
// 反转数组
void reverse(int arr[], int n) {
for (int i = 0; i < n / 2; i++) {
int mid = arr[i];
arr[i] = arr[n - 1 - i];
arr[n - 1 - i] = mid;
}
}
int main() {
char str1[1001], str2[1001];
scanf("%s %s", str1, str2);
// 分离数字
int arr1[1001], arr2[1001], a1 = 0, a2 = 0;
for (int i = 0; str1[i] != '\0'; i++) {
if (str1[i] >= '0' && str1[i] <= '9') {
arr1[a1] = str1[i] - '0'; // 将数字字符转化为数字
a1++;
}
}
for (int i = 0; str2[i] != '\0'; i++) {
if (str2[i] >= '0' && str2[i] <= '9') {
arr2[a2] = str2[i] - '0'; // 将数字字符转化为数字
a2++;
}
}
// 反转数组,便于去除前导0
reverse(arr1, a1);
reverse(arr2, a2);
// 去除前导零
while (arr1[a1 - 1] == 0 && a1 > 1) a1--;
while (arr2[a2 - 1] == 0 && a2 > 1) a2--;
// 题干条件:数据保证输出的结果在int数据类型的范围之内
// 因此本题可直接将分离的数转化为一个int型整数
int aa1 = 0, aa2 = 0;
for (int mid = 1, i = 0; i < a1; i++) {
aa1 += arr1[i] * mid; // 每个元素数字加权相加
mid *= 10; // 更新权值
}
for (int mid = 1, i = 0; i < a2; i++) {
aa2 += arr2[i] * mid;
mid *= 10;
}
printf("%d\n", aa1 + aa2);
return 0;
}
代码结构
1. 函数声明: ◦ void reverse(int arr[], int n):用于反转数组。
2. 主函数 main: ◦ 读取两个字符串 str1 和 str2。
◦ 从两个字符串中提取数字字符,存储到数组 arr1 和 arr2 中。
◦ 反转数组 arr1 和 arr2,以便去除前导零。
◦ 去除数组 arr1 和 arr2 中的前导零。
◦ 将数组 arr1 和 arr2 中的数字字符转换为整数 aa1 和 aa2。
◦ 输出两个整数的和aa1 + aa2。
代码优化 :使用strtol函数。
(想要了解strtol函数点这里:C 语言标准库函数——strtol函数-CSDN博客)
#include<stdio.h>
#include<string.h>
int main()
{
char str1[1001],str2[1001];
scanf("%s %s",str1,str2);
//分离数字
char arr1[1001],arr2[1001],a1=0,a2=0;
for(int i=0;str1[i] != '\0'; i++)
{
if(str1[i]>='0' && str1[i]<='9')
{
arr1[a1]=str1[i];//将数字字符提取出来
a1++;
}
}
for(int i=0;str2[i] != '\0'; i++)
{
if(str2[i]>='0' && str2[i]<='9')
{
arr2[a2]=str2[i];;//将数字字符提取出来
a2++;
}
}
//题干条件 :数据保证输出的结果在int数据类型的范围之内)。
//因此本题可直接将分离的数转化为一个int型整数
long int aa1,aa2;
char *aaa1,*aaa2;
aa1=strtol(arr1,&aaa1,10);
aa2=strtol(arr2,&aaa2,10);
printf("%ld\n",aa1+aa2);
return 0;
}