目录
1086:题目描述 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
1087:题目描述 输入某人的18位身份证号,输出其出生日期。
1.1
1086:题目描述
输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
输入
输入数据有多组,每组占一行,由三个字符组成,之间无空格。
输出
对于每组输入数据,输出一行,字符中间用一个空格分开。
1.2
答案:
#include<stdio.h>
int main()
{
char x[4],t;
int a,b,i=0;
while(scanf("%c%c%c",&x[0],&x[1],&x[2])!=EOF)
{
fflush(stdin);
for(a=0; a<2; a++)
for(b=0; b<2-a; b++)
if(x[b]>x[b+1])
{
t=x[b];
x[b]=x[b+1];
x[b+1]=t;
}
for(i=0; i<3; i++)
printf("%c ",x[i]);
printf("\n");
}
return 0;
}
2.1
1087:题目描述
输入某人的18位身份证号,输出其出生日期。
输入
多实例测试。首先输入一个整数n,表示测试实例的个数,然后是n行,每行是一个18位身份证号。
输出
对于输入的每个身份证号,输出一行,即其对应的出生日期,输出格式为:yyyy-mm-dd。
2.1
答案1:
#include<stdio.h>
int main()
{
char x[19];
int i,n;
scanf("%d",&n);
getchar();
for(n; n>=1; n--)
{
for(i=0; i<18; i++)
scanf("%c",&x[i]);
printf("%d%d%d%d-%d%d-%d%d\n",x[6]-48,x[7]-48,x[8]-48,x[9]-48,x[10]-48,x[11]-48,x[12]-48,x[13]-48);
scanf("%c",&x[0]);
}
return 0;
}
答案2:
#include<stdio.h>
int main()
{
int n,x,y,z,a;
scanf("%d",&n);
for(n; n>=1; n--)
{
scanf("%6d",&x);
scanf("%4d",&y);
scanf("%2d",&z);
scanf("%2d",&a);
fflush(stdin);
printf("%d-%02d-%02d\n",y,z,a);
}
return 0;
}
ps:昨天没空,敲代码卡住了,今天补上.
第一题答案解析:第一次写的时候,没注意输入的回车,下一次循环总是少读取一个,卡了半天,难受。
然后是什么时候终止程序,搞了好久才成功,EOF为判定整型,没强制转换编译也给过了,行吧。然后是oj判定问题,我用fflush(stdin)清空内存缓存区来解决回车误读取和输入不规范(输多)问题,增加代码容错性。但是oj判定答案错误,不知道为啥,然后我去搜了下答案,发现了另一种写法,前面正常读取,最后加个读取x[0]来取代误读取的回车,oj这个给过了emmm血压拉满了。
第二题答案解析:答案一:简单粗暴,用字符型读取数字,可以一个一个读取,0对应ASCLL为48。
答案二:%md,m为数字,代表读取几个数字,开头读取,然后循环,如果一行数字没读完后面循环会继续读,不够则空着;记得加fflush(stdin)清空内存缓存取(本行中,除了要读取的列数,其他列数清空)
输出%02d代表输出两列(两位数),不足补0,如1,输出01.
例如:
410104198202095479
第一次循环:x=410106, y=1982,z=02,a=09.输出1982-02-09
第二次循环:x=8657(第一次读取时未读取剩下部分,因为回车,不够位数空着,超过位数则由y继续读取),y=4101,z=04,a=19