当前位置: 首页 > article >正文

字符串提取数字求和⭐

题目描述(题目难度⭐)

输入两个字符串,分别将它们中的数字分离出来,前置0自行省略,(例如:0d1a5a3分离数字后为153)。若没有数字,则分离结果为0。 请输出两个字符串分离出的两个非负整数相加的结果(数据保证输出的结果在int数据类型的范围之内)。

输入

输入两个字符串,数据保证字符串长度不超过1000且仅包含数字和字母两种类型的字符。

输出

输出从两个字符串中分离出的两个非负整数相加后的结果。


本题思路:从两个字符串中提取数字字符,将这些数字字符转换为整数,然后将这两个整数相加并输出结果

代码思路

  1. 读取输入

    • 使用 scanf 读取两个字符串 str1 和 str2,字符串长度不超过1000。
  2. 提取数字

    • 使用两个 for 循环分别遍历 str1 和 str2,检查每个字符是否为数字。
    • 如果字符是数字,将其转换为整数并存储到数组 arr1 和 arr2 中,同时记录数组的长度 a1 和 a2
  3. 反转数组

    • 调用 reverse 函数反转数组 arr1 和 arr2,以便去除前导零。
  4. 去除前导零

    • 使用 while 循环从数组的末尾开始,去除前导零,更新数组的长度 a1 和 a2
  5. 转换为整数

    • 使用两个 for 循环将数组 arr1 和 arr2 中的数字字符转换为整数 aa1 和 aa2
    • 每个数字字符乘以相应的权值(10的幂)并累加到 aa1 和 aa2 中。
    • 输出结果
  6. 输出两个整数的和 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;
}


http://www.kler.cn/a/504869.html

相关文章:

  • 卷积神经02-CUDA+Pytorch环境安装
  • Windows 环境下安装和启动 Redis 服务
  • ShaderJoy —— 如何判别直线是否和二次贝塞尔曲线相交【GLSL】
  • 【SH】Xiaomi9刷Windows10系统研发记录 、手机刷Windows系统教程、小米9重装win10系统
  • Spring Boot中的扫描注解如何使用
  • 小游戏前端地区获取
  • Spring Boot 应用开发中的核心注解及扩展(包含自动配置源码追踪)
  • 2025.1.15——二、字符型注入
  • STM32 物联网智能家居 (三) 输入子系统
  • 语言月赛 202407【significance】题解(AC)
  • Web_HTML+CSS_First_Asignment
  • C#对动态加载的DLL进行依赖注入,并对DLL注入服务
  • 前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单
  • linux 端口转发工具rinetd
  • Flask安全开发
  • 亚洲科技创新之夜即将闪耀CES Asia 2025首日
  • 网络安全测评质量管理与标准解读
  • Tmux复制时将内容传递到系统剪贴板
  • vue2 web 多标签输入框 elinput是否当前焦点
  • C++ 数据结构:基本概念、时间复杂度、空间复杂度
  • YOLOv9改进,YOLOv9自研检测头融合HAttention用于图像修复的混合注意力检测头
  • Leetcode 474. 一和零 多重背包问题,动态规划
  • QT 键值对集合QMap
  • 【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS
  • 标准通上线标准「全文检索」功能,提升查询精准度!
  • Android控件底色蓝色无法修改、高版本无法安装app、找不到xml、找不到java文件、目录不显示等问题