首页 > 其他分享 >PTA-C语言-数组-字符串转换成十进制整数

PTA-C语言-数组-字符串转换成十进制整数

时间:2024-11-12 14:47:19浏览次数:3  
标签:字符 && 十六进制 number PTA C语言 arr2 arr1 十进制

题目:

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

+-P-xf4+-1!#

输出样例:

-3905

思路:

读取字符串

用arr1[](字符型)来读取字符串。注意题目要求以#结尾,则可以用scanf("%[^#]",arr);来控制。

提取十六进制字符

用arr2[](字符型)来保存arr1[]的十六进制字符。用循环进行遍历,内层使用选择结构用ASCII码值来控制条件为数字,A-F,a-f。ps:注意在arr2结尾加上'\0',表示截止。

进制转换

题目中设计到了数字和大小写字母,要分开讨论,并且其字符形式是字符,进行计算时要加以注意。用num=0;来计算各个位上的总和。用n=0;来表示进制转换时的16的n次幂

外层依然用循环来遍历arr2上的各个位数。但要控制其从最低位开始(读取时从最高位开始读取),需要设置起始值为(strlen(arr2)-1),条件是i>=0,迭代条件是i--,n++(后面会用到n)

内层用选择分支分别对数字,大写字母,小写字母分类讨论。数字一般情况处理,字母以大写字母为例:该位置上的十进制转化式(以C为例)为 num=num+('C'-'A'+10)*pow(16,n);'C'-'A'部分表示该字母与A的距离,而但凡是字母则表示其>=10所以需要+10。

负号检测

我们可以在最后输出num的时候进行判断是否要取绝对值。题目要求:如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。所以我们可以在最开始number=1,如果一旦检测到了十六进制字符就使number=0,表示已经读取过了十六进制字符。我们用flag=1来标记是否要取绝对值在确保在number=1的同时,如果同时读取到了'-',就让flag=0;最后输出的时候遍输出其绝对值。反之。。。

代码:

# include<stdio.h>
# include<math.h>
int main(){
    char arr1[99];
    scanf("%[^#]",arr1);
    char arr2[99],j=0;
    int flag=1,count=0,number=0;
    for(int i=0;arr1[i]!='\0';i++){
        if(arr1[i]=='-'&&number==0) {
            flag=0;
        }
        if(arr1[i]>=48&&arr1[i]<=57||arr1[i]>=65&&arr1[i]<=70||arr1[i]>=97&&arr1[i]<=102){
            arr2[j]=arr1[i];
            j++;
            count++;
            number=1;
        }
    }
    int num=0,n=0;
    for(int i=count-1;i>=0;i--,n++) {
        if(arr2[i]>=48&&arr2[i]<=57) {
            num=num+(arr2[i]-'0')*pow(16,n);
        }else if(arr2[i]>=65&&arr2[i]<=70) {
            num=num+(arr2[i]-'A'+10)*pow(16,n);
        }else if(arr2[i]>=97&&arr2[i]<=102) {
            num=num+(arr2[i]-'a'+10)*pow(16,n);
        }
    }
    if(flag==1) {
        printf("%d",num);
    }else {
        printf("%d",-num);
    }

    return 0;
}

标签:字符,&&,十六进制,number,PTA,C语言,arr2,arr1,十进制
From: https://blog.csdn.net/2401_87626632/article/details/143713886

相关文章

  • C语言入门到精通(第六版)——第十四章
    14、文件    文件是一组相关数据的有序集合,是程序设计中的一个重要概念。通常情况下,使用计算机主要是在使用文件。要进行数据处理,往往也需要通过文件来完成。14.1、文件概述    文件是一组相关数据的有序集合,这个数据集有一个名称,叫做文件名。    ......
  • PTA-C语言-一维数组-出生年
    题目:以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。输入格式:输入在一行中给出出生年份y和目......
  • 用c语言来计算素数和
    #include<stdio.h>intisPrime(intnum){  if(num<2){    return0;//小于2的数不是素数  }  for(inti=2;i*i<=num;i++){    if(num%i==0){      return0;    }  }  return1;......
  • 基础数据结构【c语言版】之 “图” 详细讲述
    别忘了请点个赞+收藏+关注支持一下博主喵!!!1. 图的定义和术语1.1图的定义**图(Graph)**是由顶点(Vertex)和边(Edge)组成的一个集合,可以表示顶点之间的关系。通常,图可以表示为G=(V,E)G=(V,E)G=(V,E),其中:VVV是顶点集合,表示图中的所有顶点。EEE是边集合,表示图中顶点之间的连接......
  • C语言设置安全长跳转(setjmp/longjmp)
    #include<stdio.h>#include<stdlib.h>#include<setjmp.h>staticjmp_bufenv;voidd(void){ fprintf(stdout,"%s\n",__func__); fprintf(stdout,"dend\n"); longjmp(env,10);//跳转到设置点}voidc(void){ fprintf(std......
  • 简易的学生信息管理系统制作——C语言实现
    菜单代码#include"head.h"intmain(intargc,constchar*argv[]){ intch,k; //登录注册 while(1) { printf("\t1、注册\n"); printf("\t2、登录\n"); printf("\t0、退出\n"); printf("请输入你的选择:"); scanf(&quo......
  • C语言中“type”的含义
    在C语言中,“type”是指数据类型,它定义了变量可以存储的数据种类以及可以对这些数据执行的操作。C语言提供了一系列基本的数据类型,它们包括但不限于:整型(IntegerTypes):int:用于存储整数。short和long:分别用于存储较短或较长的整数。signed和unsigned:前者可以存储正数和......
  • c语言入门第六天输入函数
    一:字符输入函数a:字符输入函数格式为getchar();b:功能:从键盘输入一字符c:返回值:正常,返回从键盘输入的代码值,出错或结束返回-1d:代码展示输出单一字符2:格式输入函数a:格式:scanf("格式控制符",地址表)b:功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回......
  • 在C语言中用函数求fibonacci(斐波那契)数列前n项的和
    1.功能用函数求fibonacci数列前n项的和。2.说明fibonacci数列为数列的第一项值为1,第二项值也为1,从第三项开始,每一项均为其前面相邻两项的和。3.题目例如:当n=28时,运行结果:832039。请编写sum函数。#include<stdio.h>//函数sum用于计算斐波那契数列前n项的和longsum......
  • 重温c语言之,7天开整,就是随便的写写,第十天
    一:操作符&:按位与----2进制|:按位或----2进制^:按位异或----2进制~:按位取反---2进制&:先上代码,然后解释1#define_CRT_SECURE_NO_WARNINGS23#include<stdio.h>4intmain()5{6inta=3;7intb=-5;8intc=a&......