【字符串】拼数字并排序(抽离字符串片段)(临时扫描头)

问题描述
对于输入的字符串(只包含字母和数字),将其中的连续数字拼接成整数,然后将这些整数按从大到小顺序输出。
例如字符串“abc123d5e7f22k9”中共有5个数字123,5,7,22,9,因此应输出123 22 9 7 5。

输入说明
输入为一个字符串,字符串长度不超过100,其中最长的连续数字不超过10个,字符串中至少包含1个数字。

输出说明
对于输入的字符串,在一行上输出排序结果,整数间以一个空格间隔。

输入样例
abc123d5e7f22k9

输出样例
123 22 9 7 5
.
.
.
这道题的难点在于:在扫描到数字的时候同时也要记录下来,并且要同时把其转化为整形。于是,当我们用i扫描到首数字以后,要创建一个临时往后扫描的tempi,进行一系列的处理。关键程序如下:

for (i=0; i<=len-1; i++)
  {
      if (x[i]>='0' && x[i]<='9')
      {
          a++;            
          int tempi=i;
          int templen=0;    //记录该数字的字面长度
          while (x[tempi]>='0' && x[tempi]<='9')  //第一遍扫描字面长度
          {
              templen++;
              tempi++;
          }
           tempi=i;
           i+=templen;  //在这里就要让i往后走了
          while (x[tempi]>='0' && x[tempi]<='9')  //第二遍扫描数字,转成整形
          {
              zx[k]+=(x[tempi]-'0')*my_pow(templen);
              templen--;
              tempi++;
          }
           k++;
      }
  }

当然,这样写还是比较复杂的。其实不需要扫描出字面长度和创建my_pow函数,可以直接扫到一位录入一位整形数字,每次×10。这个比较简便的算法,我在之前的博客中有写到过。
字符转整形的简便算法https://blog.csdn.net/GalaxyerKw/article/details/110407457
.
.
.
下面是完整的代码:

#include<stdio.h>
#include<string.h>

int my_pow(int n)
{
    int i;
    int sum=1;
  for(i=1; i<=n-1; i++)
  {
      sum*=10;
  }
    return sum;
}

void swap (int *x , int *y)
{
   int temp;
   temp=*x;
   *x=*y;
   *y=temp;
}

int main(void)
{
   char x[101];
   gets(x);
   int len=strlen(x);
   int i,j;
   int zx[100]={0};
   int k=0;
   int a=0;       //记录完整数字段个数
  for (i=0; i<=len-1; i++)
  {
      if (x[i]>='0' && x[i]<='9')
      {
          a++;            
          int tempi=i;
          int templen=0;    //记录该数字的字面长度
          while (x[tempi]>='0' && x[tempi]<='9')  //第一遍扫描字面长度
          {
              templen++;
              tempi++;
          }
           tempi=i;
           i+=templen;  //在这里就要让i往后走了
          while (x[tempi]>='0' && x[tempi]<='9')  //第二遍扫描数字,转成整形
          {
              zx[k]+=(x[tempi]-'0')*my_pow(templen);
              templen--;
              tempi++;
          }
           k++;
      }
  }

   for (i=0; i<a-1; i++)   //bbs
   {
       for (j=0; j<a-1-i; j++)
       {
           if (zx[j]<zx[j+1])
           {
               swap(zx+j,zx+j+1);
           }
       }
   }

   for (i=0; i<=a-1; i++)
   {
       printf("%d ",zx[i]);
   }

    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值