XYNU OJ 1120: 习题8-16 整数提取

该博客介绍了OJ 1120题目的解决方案,涉及从包含数字和非数字字符的字符串中提取连续整数。要求将连续数字作为整数存入数组,并统计整数个数。核心是将数字字符串转换为整数。
摘要由CSDN通过智能技术生成

1120: 习题8-16 整数提取

时间限制: 1 Sec   内存限制: 12 MB

题目描述

输入一个字符串,内含数字和非数字字符,如:

A123x456.17960?302t ab5876

将其中连续的数字作为一个整数,依次存放在一个整型数组中(假设数组名为a)。如上例所示,将123放在a[0]中,456放在a[1]中,17960放在a[2]中,........,同时统计整数的个数并输出相关的信息。

输入

一行字符串(以回车结束),可含空格

输出

输出数据分多行,每行一个数据。其中第一行是字符串中包含的整数个数,从第二行开始依次输出各个整数。

样例输入

A123x456.17960?302t ab5876

样例输出

5

123

456

17960

302
5876

提示


学会将一个数字字符序列(数字字符串)转换成一个整数



如"456"-->456



可按十进制数制进行转换

C语言代码:

#include <stdio.h>
int main()
{
 char str[50],*pstr;
 int i,j,k,m,e10,digit,ndigit,a[10],*pa;
 
 gets(str);
 pstr=&str[0];    /*字符指针pstr置于数组str 首地址*/
 pa=&a[0];        /*指针pa置于a数组首地址*/
 ndigit=0;        /*ndigit代表有多少个整数*/
 i=0;             /*代表字符串中的第几个字符*/
 j=0;
 while(*(pstr+i)!='\0')
 {
 if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
       j++;
     else
       {
	   if (j>0)
        {
		digit=*(pstr+i-1)-48;          /*将个数位赋予digit*/
         k=1;
         while (k<j)     /*将含有两位以上数的其它位的数值累计于digit*/
           {
		   e10=1;
         for (m=1;m<=k;m++)
         e10=e10*10;                  /*e10代表该位数所应乘的因子*/
         digit=digit+(*(pstr+i-1-k)-48)*e10;  /*将该位数的数值\累加于digit*/
         k++;                   /*位数K自增*/
           }
         *pa=digit;               /*将数值赋予数组a*/
         ndigit++;
         pa++;                    /*指针pa指向a数组下一元素*/
         j=0;
        }
    }
     i++;
    }
 if (j>0)                         /*以数字结尾字符串的最后一个数据*/
  {
  digit=*(pstr+i-1)-48;          /*将个数位赋予digit*/
   k=1;
   while (k<j)          /* 将含有两位以上数的其它位的数值累加于digit*/
    {
	e10=1;
     for (m=1;m<=k;m++)
       e10=e10*10;            /*e10代表位数所应乘的因子*/
     digit=digit+(*(pstr+i-1-k)-48)*e10;  /*将该位数的数值累加于digit*/
     k++;  /*位数K自增*/
    }
   *pa=digit;                 /*将数值赋予数组a*/
   ndigit++;
   j=0;
  }
  printf("%d\n",ndigit);
  j=0;
  pa=&a[0];
  for (j=0;j<ndigit;j++)            /*打印数据*/
    printf("%d\n",*(pa+j));
  return 0;
}


C++代码:

#include <iostream>
using namespace std;
int main()
{char str[50],*pstr;
 int i,j,k,m,e10,digit,ndigit,a[10],*pa;
 
gets(str);
cout<<endl;
pstr=&str[0];    //字符指针pstr指向数组str首元素 
pa=&a[0];        //指针pa指向a数组首元素
ndigit=0;        //ndigit代表有多少个整数 
i=0;             //i代表字符串中的第几个字符/
j=0;             //j代表连续数字的位数 
while(*(pstr+i)!='\0')
 {if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
    j++;
  else
   {if (j>0)
     {digit=*(pstr+i-1)-48;          //将个数位赋予digit
      k=1;
      while (k<j)     //将含有两位以上数的其它位的数值累计于digit
       {e10=1;
        for (m=1;m<=k;m++)
        e10=e10*10;                  //e10代表该位数所应乘的因子
        digit=digit+(*(pstr+i-1-k)-48)*e10;  //将该位数的数值累加于digit
        k++;                         //位数k自增
       }
      *pa=digit;                     //将数值放在数组a中
      ndigit++;
      pa++;                         //指针pa指向a数组下一元素
      j=0;
     }
   }
  i++;
 }
 if (j>0)                         //以数字结尾字符串的最后一个数据
  {digit=*(pstr+i-1)-48;          //将个数位赋予digit
   k=1;
   while (k<j)          // 将含有两位以上数的其它位的数值累加于digit
    {e10=1;
     for (m=1;m<=k;m++)
       e10=e10*10;            //e10代表位数所应乘的因子
     digit=digit+(*(pstr+i-1-k)-48)*e10;  //将该位数的数值累加于digit
     k++;  /*位数K自增*/
    }
   *pa=digit;                 //将数值放到数组a中
   ndigit++;
   j=0;
  }
  printf("%d\n",ndigit);
  j=0;
  pa=&a[0];
  for (j=0;j<ndigit;j++)            //打印数据
    cout<<*(pa+j)<<endl;
  cout<<endl;
  return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值