科协招新题目B:分割

题目描述


B分割

ProblemDescription

输入一行数字,如果我们把这行数字中的‘9’都看成空格,那么就得到一行分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。 

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于100。 

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘9’组成。 

Output

对于每个测试用例,输出分割得到的整数,相邻的两个整数之间用一个“,”分开,每组输出占一行。

SampleInput

92229219995599

SampleOutput

222,21,55


解法一:

#include "stdio.h"
#include "string.h"
int substr(char*des,char* src,int start);
void print(char* des);
void main()
{
	//start 截取字符串的起点下标 count截取的字符串长度
	int start,count;
	//length:输入的字符串长度,p_count为了输出“,”
	int length,p_count=0;
	char src[100],des[100];
	//EOF是宏定义表示-1
	//一般用这种写法输入多组数据
	while(scanf("%s",src)!=EOF)
	{
		start=p_count=0;
		length=strlen(src);
		while(start<length)
		{
			count=substr(src,des,start);
			if(count!=0)
			{
				if(p_count!=0)
					printf(",");
				print(des);//这里是通过格式化字符串输出,
							//其实题意应该是把字符串转化为数字再输出,可以试试
				p_count++;
			}
			start+=count+1;
		}
		printf("\n");
	}
}
//截取字符串
int substr(char* src,char* des,int start)
{
	int i;
	for(i=start;src[i]!='\0';i++)
	{
		if(src[i]=='9')
		{
			break;
		}
		des[i-start]=src[i];
	}
	des[i-start]='\0';
	return i-start;	
}
//格式化输出
void print(char* des)
{
	//如果第一个字符为零,一直自增到不为零为止
	while(*des=='0')
		des++;
	if(*des=='\0')//如果全是0,输出零
	{
		printf("0");
	}else
	{
		printf("%s",des);
	}
}
结果:



解法二:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
void Split(const char* str, char* delims) ;
char* pStr[50];  
int length = 0;  
void main()
{
	int i;
	char strSrc[100];
	while(scanf("%s",strSrc)!=EOF)
	{
		Split(strSrc,"9");
		for(i=0;i<length;i++)
		{
			printf("%d",atoi(pStr[i]));
			if(i!=length-1)
				printf(",");
		}
			printf("\n");
	}
}

//自定义Split()函数//  
//参数:/  
//1:要分割的字符串///  
//2:分隔符///  
//功能:实现分割字符串//  
void Split(const char* str, char* delims)  
{  
    char *p;  
    char*buffer;  
    length = 0;  
    buffer = strdup(str);  
    p = strtok(buffer, delims);  
    pStr[length++] = p;  
    while (p != NULL) {  
        p = strtok(NULL, delims);  
        pStr[length++] = p;  
    }  
    length--;  
}  
结果:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值