boj 469. 暑假作业题-数字的读法

一道关于将整数转换为中文读法的编程题,涉及处理不同数量级的零的读法。题目要求在不超过10^17的整数范围内,输出中文读法,用特定符号代替数字。主要难点在于处理中间连续的零和不同数量级的分隔。
摘要由CSDN通过智能技术生成
时间限制 1000 ms  内存限制 65536 KB

题目描述

亲爱的小朋友们,暑假过了之后,你们要二年级啦!现在老师要检测一下你们一年级学习的读数,大家准备好自己的程序了吗?来读数吧!

 

输入格式

input
输入第一行包括一个整数t,t<=10^5,接下来t行每行有一个整数Ai,Ai<10^17

 

输出格式

output
输出每个数字的中文读法,每组数据以回车结束。为了简单起见,用阿拉伯数字0-9代替汉字零到九,用S代替十,B代替百,Q代替千,W代替万,E代替亿

 

输入样例

4
10
1101000
21000
1010010000001000

输出样例

1S
1B1SW1Q
2W1Q
1Q01SW01BE1Q

hint
10要读作一十

    额怎么说呢,这道题我其实好头疼,基本上就不怎么会读数,当然啦,这道题没怎么难为我,原因有二:

       1.数据不是很大,pow(10,17)对我们而言,不过是万亿而已,还不至于很麻烦

       2.其实关键在于怎么把那些个加在中间的零选择读出还是不读出


做题总结:我其实就卡在两个地方

       1.在读出不满四位数的字节段的时候参数怎么设置使他满足getstr()函数;

       2.我碰到这样一种情况:对 1010010000001000输出,

          错误答案:1Q01SW01BEW1Q

          正确答案:1Q01SW01BE1Q 产生这样的原因和我使用的方法有联系;

我采用了 每每四位去读,这样可以不用重复写代码,判零也灰常方便,但是,这样就必须将 W(四位一个) E(八位一个) 这些单独输出,有的时候,这些个四位上均为0,那么就不能输出了,数据给得小,所以只要加个判断条件,就OK,但是我觉得吧,再多几重,可能读法问题就大了

这道题其实没什么知识点,但是,它告诉偶们一个很好地道理,有一些东西,能合并着写,能找到规律,就不要重复写,这样既不美观,也不让人舒心;与其重复写几遍,不如多想几遍,有个共通性的话,就会方便很多

基本思路见代码

#include 
   
   
    
    
#include 
    
    
     
     
char number[50];///用来存放输入的数据,采用了char
char result[4][15];///因为数字位数不超过16,所以最多四组
int main()
{
	int los;int len;int length;int locate;
	/**
	los:记录第一有效位(防止前导零)
	len:记录数字总长度
	length:记录数据最后一位
	locate:用来记录每个result[i]的最后一位
	*/
	int i,j,k;
	int n;
	scanf("%d",&n);
	while(  n-- ){
        scanf("%s", number);
		length=strlen(number)-1;
		for(i=0;i<=length;i++){
			if(number[i]!='0')
				break;
		}//寻找第一有效位
		los=i;k=0;
        len=strlen(number) - los ;
		if(len==0){
			printf("0\n");
			continue;
		}
		while(len>=4){
                /**
                *每四位一组,对应写入
                */
            locate=0;
			locate=getstr(result[k],length-3,0);
			result[ k][locate]='\0';
			len-=4;
			length-=4;
			k++;
		}
		if(len){
		    ///不满四位,该怎么办,注意后两个因子的变化
			locate=getstr(result[k],los,4-len);
			result[k][ locate ]='\0';
		}
		else k-=1;
		for(j=k;j>=0;j--){
			printf("%s",result[j]);
			if(j==2){
				printf("E");
			}
			if((j==1|| j==3)&&result[j][0]!='\0'){
				printf("W");
			}
		}
		printf("\n");
	}
	return 0;
}

int getstr(char*putin,int start,int k)
{
    int i,j;
    int locate=0;
    int q=4-k;
    char zi[3]={'Q','B','S'};
	for(i=k,j=0;i<4;i++,j++)
	{
	    /**用这个方法输出中间的零,我感觉蛮好的,
	    至于为什么分了i,j两个变量,就是为了适应不是完整的4的倍数的情况*/
		if(number[start+j] != '0'){
			*(putin+locate)=number[start+j];
			locate++;
			if(i!=3){
                *(putin+locate)= zi[i];
                locate++;
			}
			else
				break;
		}
		else if( i!=3 && number[start+j+1]!='0'){
			*(putin+locate) = '0';  locate++;
		}
	}
	return locate;
}

    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值