题目描述
牛牛在玩字符串。
牛牛得到了一个字符串(可能含有空格),他希望在这些字符串中提取出数字。
例如:a1b23c456d007890中可以提取出1, 23, 456, 7890共4个数字。

现在,他得到了一个长度高达1000的字符串,请你帮他提取出所有的数字。

输入描述:
本题有多组数据。
输入一个字符串S。
输出描述:
输出提取出的所有数字,相邻两个数字用一个空格隔开。
不包含数字的时候输出空行
注意,你输出的数不能含有前导0。

图片说明

题目分析

  • 首先,这是一道考察字符串的题目,刚开始拿到题目的时候感觉到了一丝熟悉的感觉,我便快速的敲敲敲,一交,测试样例也过了,但是结果却是wa,wa,wa!!!
    后面得到大佬的提点我才发现是自己忽略了大数的存在,大数的存在已经让我错过了好多好多,所以这个题目不能去计算数有多大,而是要把数字当成字符输出,并且要注意很多细节,比如:字符串含有空格,两个数字之间要有空格,并且数字不能还有前导零,这些种种细节让我一直在思考...不过好在最后做出来了。

    方法一

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e6 + 10;
    char c[maxn];
    int main()
    {
      string s;
      int ans = 0, flag, cnt;
      while (gets(c))
      {
          s = "";
          ans = 0, flag = 0, cnt = 0;
          int lc = strlen(c);
          for (int i = 0; i < lc; ++i)
          {
              if (isdigit(c[i]))
              {
                  s += c[i]; //c++特殊加法
                  if (c[i] == '0' && flag)
                      //如果当前字符是零,且没有输出过不是零的数字字符,那么就可以判断这是一个前导零,是不需要输出来的
                      //如果当前字符是零,但有过输出不是零的数字字符那么说明他不是前导零1,可以输出
                      printf("%c", c[i]);
                  if (c[i] != '0') //不是零直接输出并且标记一下输出了
                      printf("%c", c[i]), flag = 1;
              }
              if (isdigit(c[i]) && !isdigit(c[i + 1])) //如果下一个字符不是数字字符那么要输出空格了
              {
                  int ls = s.length(); //记录长度,判断当前字符串是不是都是零,特殊情况特殊处理
                  cnt = 0;
                  for (int j = 0; j < ls; ++j)
                      if (s[j] == '0')
                          ++cnt;
                  if (cnt == ls && cnt)//如果都是零,并且有字符那么直接输出一个0
                      printf("0"), flag = 1;//有输出就标记一下,因为要判断什么时候输出空格
                  if (flag)
                      printf(" "), flag = 0;
                  s = "";
                  cnt = 0;
              }
          }
          puts("");
      }
    }