2301_79810963 2023-12-13 00:11 采纳率: 0%
浏览 42
已结题

这个提取连续数字的算法有啥问题,为什么没有满分

输入一个字符串,将连续的数字字符串放到另一个二维数组中输入格式输入一个含连续数字的待提取字符串。输出格式输出提取出来的数字字符串,每个连续数字字符串占一行。样例输入 1234abc7654321[][]79869hewl98765 样例输出 1234 7654321 98765 样例说明 79869 不连续,不输出。评测用例规模与约定提取出来的连续数字字符串长度不超过 20,输入字符串内至多含有 10 个连续字符串,时间限制 1s,内存限制 256KB。(注:1287 视为整体,不属于连续数字字符串,不可被看为是 12 与 87 两个连续数字字符串。单独的数字如 1,视为连续字符串,需要加以输出)

#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
 int continuous(char *string3){
    int i=0;
    int len=strlen(string3);
    if (len==1){
      return 1;
    }
    else{
      int d=string3[1]-string3[0];
     if (abs(d) != 1) { 
        return 0;
    }
      for (i = 1; i < len - 1; i++) {  // Start from second character.
        if (abs(string3[i + 1] - string3[i]) != 1) {  // Check if difference between current and next characters is 1.
            return 0;
        }
     }
    }
    return 1;
 }
int main(){
  char string[10000]={'\0'};
  char string2[10][20]={'\0'};
  int i=0;int j=0;int k=0;
  gets(string);
  while(string[i]!='\0'){
    int l=0;
    if(isdigit(string[i])==0){
      i++;
    }
    else if(isdigit(string[i])!=0){
      while(isdigit(string[i])!=0){
        string2[j][l]=string[i];
        i++;l++;
      }
      j++;
    }
  }
  for(i=0;i<j;i++){
    if(continuous(string2[i])==1){
      printf("%s\n",string2[i]);
    }
  }
  return 0;
}

  • 写回答

13条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2023-12-13 00:12
    关注

    由人工智能和答主提供,可以参考如下,如果回答的不正确,及时评论区回复,我追加回答,谢谢。


    这个提取连续数字的算法存在以下问题:

    1. 没有处理输入字符串中可能存在的空格和特殊字符。
    2. 在判断连续数字时,只考虑了相邻字符之间的差值是否为1,没有考虑到数字字符串内部可能存在的非连续数字。
    3. 在输出结果时,没有按照题目要求的格式输出。

    为了解决这些问题,可以对代码进行如下修改:

    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    #include<math.h>
    
    int continuous(char *string3){
        int i = 0;
        int len = strlen(string3);
        if (len == 1) {
            return 1;
        } else {
            for (i = 0; i < len - 1; i++) {
                if (!isdigit(string3[i]) || !isdigit(string3[i + 1])) {
                    return 0;
                }
                if (abs(string3[i + 1] - string3[i]) != 1) {
                    return 0;
                }
            }
        }
        return 1;
    }
    
    int main() {
        char string[10000] = {'\0'};
        char string2[10][20] = {'\0'};
        int i = 0;
        int j = 0;
        int k = 0;
        gets(string);
        while (string[i] != '\0') {
            int l = 0;
            if (!isdigit(string[i])) {
                i++;
            } else if (isdigit(string[i])) {
                while (isdigit(string[i])) {
                    string2[j][l] = string[i];
                    i++;
                    l++;
                }
                j++;
            }
        }
        for (i = 0; i < j; i++) {
            if (continuous(string2[i]) == 1) {
                printf("%s
    ", string2[i]);
            }
        }
        return 0;
    }
    

    这样修改后的代码可以正确处理输入字符串中的空格和特殊字符,以及判断连续数字的内部情况。同时,输出结果也符合题目要求。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月13日
  • 创建了问题 12月13日

悬赏问题

  • ¥100 网页游戏在本地页面修改游戏结果
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数