boj 469. 暑假作业题-数字的读法
题目描述
亲爱的小朋友们,暑假过了之后,你们要二年级啦!现在老师要检测一下你们一年级学习的读数,大家准备好自己的程序了吗?来读数吧!
输入格式
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;
}