首页 > 试题广场 >

表示数字

[编程题]表示数字
  • 热度指数:178383 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

将一个字符串中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。


数据范围:字符串长度满足

输入描述:

输入一个字符串



输出描述:

字符中所有出现的数字前后加上符号“*”,其他字符保持不变

示例1

输入

Jkdi234klowe90a3

输出

Jkdi*234*klowe*90*a*3*
//每次保存前一个字符,在字母和数字中间加*即可。需要额外判断结尾是否为数字
#include <stdio.h>

int main() {
    char c, ch = 127;
    while ((c = getchar()) != EOF) {
        if (c > '9' || c < '0') {
            if (ch <= '9' && ch >= '0') {
                printf("*");
            }
            printf("%c", c);
            ch = c;
        } else if (c <= '9' && c >= '0') {
            if (ch > '9' || ch < '0') {
                printf("*");
            }
            ch = c;
            printf("%c", c);
        }
        if (c == '\n') {
            if (ch <= '9' && ch >= '0')
                printf("*\n");
            break;
        }
    }
    return 0;
}

发表于 2024-09-13 00:54:54 回复(0)
#include <stdio.h>

int main() {
    char arr[100];
    gets(arr);
    int len = strlen(arr);
    for(int i=0;i<len;i++){
        if(arr[i]>='0'&&arr[i]<='9'){
            printf("*");
            while(arr[i]>='0'&&arr[i]<='9'){
                printf("%c", arr[i]);
                i++;
            }
            i--;
            printf("*");
        }else{
            printf("%c", arr[i]);
        }
    }
    return 0;
}

发表于 2024-08-20 01:22:50 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main() {
    char buffer[128];
    int len;

    scanf("%s", buffer);

    len = strlen(buffer);

    if(isdigit(buffer[0])){
        printf("*");
    }
    /*
        找数字和字母之间的跳变沿
    */
    for(int i=0;i<len;i++){
        int flagP = !!isdigit(buffer[i]);
        int flagA = !!isdigit(buffer[i+1]);

        printf("%c", buffer[i]);
        if(flagP + flagA == 1){
            printf("*");
        }
    }

    return 0;
}

编辑于 2024-04-01 10:56:25 回复(0)
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char str[101];
    scanf("%s", str);
    int len = strlen(str);
    int i = 0;
    int flag = 0;
    for (i = 0; i < len; i++)
    {
        if (isdigit(str[i]) && flag == 0)//str[i]是数字,并且前一个不是数字
        {
            flag = 1;
            printf("*");
        }
        else if (!isdigit(str[i]) && flag == 1)//str[i]不是数字,并且前一个是数字
        {
            flag = 0;
            printf("*");
        }
        printf("%c", str[i]);
    }
    if (isdigit(str[i - 1]))//最后一个是数字
        printf("*");
    return 0;
}
发表于 2023-12-11 11:45:18 回复(0)
思路:关键就是判断前后字符类型变化。该题对每个字符现读现判断现放是比较合适的,关键就是列出几种需要加*的情况:
①新字符是数字 && 旧字符是非数字,②新字符是字符 && 旧字符是数字,③第一个字符就是数字,④最后一个字符是数字
本提在很多细节上非常容易出错,要仔细。
#include <stdio.h>

int main() {
    char str[200] = {0};
    char tmp;
    char i = 0;
    char isStart = 1;
    while(scanf("%c", &tmp) != EOF) {
        if(tmp == '\n'){
            if (str[i] >= '0' &&  str[i] <= '9')
                str[++i] = '*';
            break;
        }
            
        if((i == 0) && (tmp >= '0' && tmp <= '9') && isStart){
            str[i] = '*';
            str[++i] = tmp;
            isStart = 0;
            continue;
        }
        else if((i == 0) && (tmp < '0' || tmp > '9') && isStart){
            str[i] = tmp;
            isStart = 0;
            continue;
        }

        if(((str[i] >= '0') &&  (str[i] <= '9')) && (tmp < '0' || tmp > '9')) {
            str[++i] = '*';
            str[++i] = tmp;
            continue;
        }

        if((str[i] < '0' ||  str[i] > '9' ) && (tmp >= '0' && tmp <= '9')) {
            str[++i] = '*';
            str[++i] = tmp;
            continue;
        }  
        str[++i] = tmp; 
    }
    printf("%s\n", str);
    return 0;
}



编辑于 2023-12-02 21:40:19 回复(0)
//是数字flag就是1,不是数字flag就是0;
//是数字,但是flag==0;就表示从非数字变成数字,需要加一个*;
//是非数字,但是flag==1,表示从数字变成非数字,需要加一个*;
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main() {
    char str[101] = {'\0'};
    while (scanf("%s", str) != EOF) {
        char ret[310] = {'\0'};
        int len = strlen(str);
        int j = 0;
        int flag = 0;
        for(int i = 0;i<len;i++)
        {
            if(isdigit(str[i])&&flag==0)
            {
                ret[j++] = '*';
                ret[j++] = str[i];
                flag = 1;
            }
            else if(!isdigit(str[i])&&flag == 1)
            {
                ret[j++] = '*';
                ret[j++] = str[i];
                flag = 0;
            }
            else {
            ret[j++] = str[i];
            }
        }
        if(flag == 1)
        {
            ret[j] = '*';
        }
        printf("%s\n",ret);
    }
    return 0;
}
发表于 2023-10-11 12:54:32 回复(0)
#include <stdio.h>
#include <string.h>
int main()
{
    char buf[100]={};
    scanf("%s",buf);
    int len,i=0,j;
    len=strlen(buf);
    while(buf[i]!='\0')
    {
        if((buf[i]>='0'&&buf[i]<='9')&&(buf[i+1]<'0'||buf[i+1]>'9'))//数字-->字母
        {
            for(j=len;j>i;j--)
            {
                buf[j+1]=buf[j];
            }
            buf[i+1]='*';
            len++;
            i++;
        }
        else if((buf[i+1]>='0'&&buf[i+1]<='9')&&(buf[i]<'0'||buf[i]>'9')) //字母-->数字
        {
            for(j=len;j>i;j--)
            {
                buf[j+1]=buf[j];
            }
            buf[i+1]='*';
            len++;
            i++;
        }
        i++;
    }
    if(buf[len-1]>='0'&&buf[len-1]<='9')  //最后一个是数字
    {
        buf[len]='*';
        buf[len+1]='\0';
    }
    else if(buf[0]>='0'&&buf[0]<='9')  //开头是数字
    {
        for(j=len;j>=0;j--)
        {
            buf[j+1]=buf[j];
        }
        buf[0]='*';
    }
    printf("%s\n",buf);
    return 0;
}
发表于 2023-04-18 20:35:22 回复(0)
#include <stdbool.h>
#include <stdio.h>

int main() {
    char arr[100] = {0},temp_arr[400] = {0};//注意这里要初始化为0,因为为下面for循环是以字符\0作为条件的
    gets(arr);

    //flag表示是否进入数字字符串之间
    char flag = 0;
    for (int i = 0,j = 0; arr[i] != '\0'; i++) {
       
        if (arr[i]>=48 && arr[i]<=57) {
            if (flag == 0) {//刚进入就打印*以及数字
                temp_arr[j++] = '*';
                temp_arr[j++] = arr[i];
                flag = 1;
            }else if (flag == 1 && arr[i]>=48 && arr[i]<=57) {//在数字字符串中间就打印数字
                temp_arr[j++] = arr[i];
            }

            //如果当前数字后一个字符不是数字,就以*结尾,将flag置为0;
            if (flag == 1 && !(arr[i+1]>=48 && arr[i+1]<=57)) {
                temp_arr[j++] = '*';
                flag = 0;
            }
        }else {//除数字外的字符照常打印
            temp_arr[j++] = arr[i];
        }
    }
    printf("%s",temp_arr);
    return 0;
}
发表于 2023-04-18 12:49:34 回复(0)
发表于 2023-02-24 22:37:30 回复(1)

我要是会python该多好

#include <stdio.h>
#include <ctype.h>

int main()
{
    char str[101] = {0}, *cur = str;
    scanf("%s", str);

    while (*cur) {
        if (isdigit(*cur) && (cur == str || !isdigit(*(cur - 1)))) 
            printf("*");
        printf("%c", *cur);
        if (isdigit(*cur) && (*(cur + 1) == 0 || !isdigit(*(cur + 1))))
            printf("*");
        cur++;
    }
    return 0;
}
发表于 2022-06-20 15:50:01 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char str[101] ={'\0'};
    char dst_str[200] = {'\0'};
    int i = 0,j = 0,len = 0;
    while(scanf("%s",str)!=EOF)
    {
        len =strlen(str);
        for(i = 0;i<len;i++)
        {
            if(str[i]>='0'&& str[i] <='9')
            {
                dst_str[j] = '*';
                j++;
                do{
                    if(str[i]>='0'&& str[i] <='9')
                    {
                        dst_str[j] = str[i];
                        j++;
                    }
                    else
                    {
                        break;
                    }
                    i++;
                }while(i<len);
                dst_str[j] = '*';
                j++;
                i--;
            }
            else
            {
                dst_str[j] = str[i];
                j++;
            }
        }
        printf("%s\n",dst_str);
    }
    return 0;
}

发表于 2022-06-19 19:08:04 回复(0)
#include<stdio.h>
int main(){
    char str[100];
    char stack[200];
    memset(stack,0,sizeof(stack));
    int pos=0;
    fgets(str,sizeof(str),stdin);
    char *p = str;
    char *q = p;
    while(*p!='\n'){
        if(isdigit(*p) && !isdigit(stack[pos-1])) stack[pos++]='*';
        if(!isdigit(*p) && isdigit(stack[pos-1])) stack[pos++]='*';
        stack[pos++]=*p;
        if(isdigit(*p) && *(p+1)=='\n')stack[pos++]='*';
        p++;
    }
    printf("%s",stack);
    return 0;
}
发表于 2022-05-11 23:08:35 回复(0)
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
    char ch;
    struct list *next;
}list;
int main()
{
    list *p0,*p1,*p2;
    char temp;
    p2 = p1 = p0 = (list*)malloc(sizeof(list));
    scanf("%c", &temp);
    while (temp != '\n')
    {
        p1 = p2;
        p1->ch = temp;
        p1->next = malloc(sizeof(list));
        p2 = p1->next;
        scanf("%c", &temp);
    }
    p1->next=NULL;
    p1=p0;
    p2=p1->next;
    if(p1->ch>='0'&&p1->ch<='9')
    {
        p0=malloc(sizeof(list));
        p0->ch='*';
        p0->next=p1;
    }
    while(p2!=NULL)
    {
        if((!(p1->ch>='0'&&p1->ch<='9')&&(p2->ch>='0'&&p2->ch<='9'))||
           ((p1->ch>='0'&&p1->ch<='9')&&!(p2->ch>='0'&&p2->ch<='9')))
        {
            p1->next=(list*)malloc(sizeof(list));
            p1->next->ch='*';
            p1->next->next=p2;
        }
        p1=p2;
        p2=p2->next;
    }
    if(p1->ch>='0'&&p1->ch<='9')
    {
        p1->next=(list*)malloc(sizeof(list));
        p1->next->ch='*';
        p1->next->next=NULL;
    }
    p1=p0;
    while(p1!=NULL)
    {
        printf("%c",p1->ch);
        p1=p1->next;
    }
    return 0;
}

发表于 2022-04-26 12:54:06 回复(0)
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main(void)
{
    //定义两个字符数组,ch用于存放原数据,temp用于存放改变后的数据
    char ch[101],temp[121];
    gets(ch); //获取原数据
    int j = 0,i,t=0; //t用于记录连续的数字的个数
    for (i = 0; ch[i]!='\0'; i++) //遍历原数组
    {
        if (ch[i] >= '0' && ch[i] <= '9') //当遇到数字字符时
        {
        	t+=1; //t记录连续的数字个数,并加一
        	int flag=1; //记录该数字的左侧或右侧是否被改变
            //判断数字字符的左侧是否为非数字
            if (!isdigit(ch[i - 1]))
            {
                temp[j++] = '*';
                temp[j++] = ch[i];
                flag=0;//左侧被改变
            }
             //判断数字字符的右侧是否为非数字
            if (!isdigit(ch[i + 1]))
            {
                if(t==1) //连续部分只有一个数字时
                {
                	temp[j++]='*';
				}
				else {
					temp[j++]=ch[i];
					temp[j++]='*';
				}
				flag=0;//右侧被改变
            }
            if(flag) temp[j++]=ch[i]; //未被处理时
        }
        else {
		temp[j++] = ch[i]; //不是数字字符时
		t=0; //t归零,表示数字连续部分结束,下次重新计数
    }
}
     //在temp的最后一个有效字符后加上'\0',构成字符串,便于输出
    temp[j] = '\0';
    puts(temp);//输出结果
    return 0;
}
发表于 2022-04-08 11:07:41 回复(0)
代码应该没问题,但是用例:1**3和1a*b3无法通过,希望有大佬帮忙解答一下。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    int mark = 0;
    char str[101] = {'\0'};
    while (~scanf("%s", str)) {
        int len = strlen(str);
        for (int i = 0; i < len; i++) {
            if (str[i] >= '0' && str[i] <= '9' && mark == 0) {
                printf("*");
                mark = 1;
            } else if ((str[i] < '0') || (str[i] > '9') && (mark == 1)) {
                printf("*");
                mark = 0;
            }
            printf("%c", str[i]);
            if (i == (len - 1) && str[i] >= '0' && str[i] <= '9') printf("*\n");
        }
    }
}

图一:

图二:

图三:

发表于 2022-04-01 23:18:12 回复(1)
直接print比用数组双指针处理简单,算是取巧吧
/*
思路:用一个整形prisdi记录前面一个字符是否为数字
     如果in[i]当前字符与前一字符都为数字或都不是,直接输出in[i]
     如果in[i]当前字符与前面一个字符类型相异,先输出星号再输出in[i]
     结束时若末尾字符为数字,补打印星号结尾
复杂度:时间复杂度为o(n); 空间复杂度O(1)
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(void)
{
    char in[101];
    while(scanf("%s", in) != EOF){
        int prisdi = 0; 
        for(int i=0; i<strlen(in); i++){
            if( isdigit(in[i]) ^ prisdi){    //与前一类型相异,打印星号
                putchar('*');
            }
            putchar(in[i]);
            prisdi = isdigit(in[i]);
        }
        
        if(prisdi){                         //处理最后一个字符为数字的情况
            putchar('*');
        }
        putchar('\n');
    }
    return 0;
}


发表于 2022-01-23 22:01:47 回复(0)
可以用字符串的查找和插入来完成。
#include<stdio.h>
#include<string.h>
#define Size 1000

void back_insert(char str[],int loc,int len)
{
    int i;
    for(i=len;i>loc;i--){
        str[i]=str[i-1];
    }
    str[i]='*';
    str[len+1]='\0';
}

int main(){
    char str[Size];
    while(scanf("%[^\n]",str)!=EOF){
        scanf("%*[^\n]");scanf("%*c");
        int i=0;
        int t;
        while(str[i]){
            int len=strlen(str);
            if(str[i]>=48&&str[i]<=57){
                back_insert(str,i,len);
                len++;
                i+=2;

                while(str[i]>=48&&str[i]<=57)i++;
                back_insert(str,i,len);
                len++;
                i+=2;
            }else i++;
            t=len;
        }
        printf("%s\n",str);

        //重新初始化!!不然会导致第二次输出字符串错误
        for(int i=0;i<t;i++){
            str[i]='\0';
        }
    }
    return 0;
}

发表于 2022-01-21 15:02:23 回复(0)
#include<stdio.h>
int main()
{
    char a[1000];
    int i=0;
    while(scanf("%s",&a)!=EOF)
          {  int flag=0;
              for(i=0;i<strlen(a);i++)
              {
                  if(a[i]>='0'&&a[i]<='9')
                  {
                      if(flag==0)
                      {
                          flag=1;
                        printf("*");
                       printf("%c",a[i]);
                      }
                      else printf("%c",a[i]);
                  }
                 else
                 {
                     if(flag==0) printf("%c",a[i]);
                     else
                     {
                        printf("*");
                       printf("%c",a[i]); 
                           flag=0;
                     }
                 }
                   
                      if(a[i+1]=='\0'&&flag==1)
                           printf("*");    
                  }
               printf("\n");  
              }
         
}

发表于 2021-11-14 15:53:11 回复(0)