题目一:
给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。表示时间,表示分钟, 而表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。
输入
在一行中输入一个整数t(0<=t<=86399)。
输出
在一行中按“::”的格式输出转换的时间,不包括引号。
输入样例 1
0
输出样例 1
0:0:0
输入样例 2
5436
输出样例 2
1:30:36
注意:分钟应该是小时后对60取余
代码:
#include <stdio.h>
#include <string.h>
int main()
{
int n;
scanf("%d",&n);
int a,b,c;//a是小时,b是分钟,c是秒数
a=n/3600,b=n/60%60,c=n%60;
printf("%d:%d:%d",a,b,c);
return 0;
}
题目二:
给定当前的时间,请用英文的读法将它读出来。
时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
时和分的读法使用的是英文数字的读法,其中0~20读作:
0:zero, 1: one, 2:two, 3:three, 4:four, 5:five,6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen,14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen,20:twenty。
30读作thirty,40读作forty,50读作fifty。
对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
按上面的规则21:54读作“twenty onefifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。
输入
在一行输入包含两个非负整数h和m,表示时间的时和分,整数之间用空格隔开。非零的数字前没有前导0。h小于24,m小于60。
输出
输出时间时刻的英文。
0 15
输出样例 1
zero fifteen
输入样例 2
12 27
输出样例 2
twelve twenty seven
思路:直接打表,一个外国网站上面教学的打表法,需要网站的咸鱼找我,在这上面会被限流。
打表,类似hash表,遇到的数字,转化为对应得数字,打出来就好了;
代码:
#include <stdio.h>
#include <string.h>
char *time[]={
"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen", "fifteen", "sixteen", "seventeen", "eighteen","nineteen","twenty","twenty one","twenty two","twenty three","twenty four"};//这个是小时,小时一共只有24个
char *time1[]={
"zreo","ten","twenty","thirty","forty","fifty","sixty"};//判断十位数是什么
int main()
{
int h,m;
scanf("%d %d",&h,&m);
if(m==0)
{
printf("%s o'clock",time[h]);//先把最简单的判断掉,如果分钟是0的话就不要输出了,直接输出%s,对应的小时输出这里只有24个读法,所以time1存了24个
}
else
{
if(m>=20&&m<=60)//如果大于20小于60的话要特判掉
{
int t1=m%10;//判断个位怎么读
int t2=m/10;//判断十怎么读
printf("%s %s %s",time[h],time1[t2],time[t1]);/读出小时,读出后面的分钟的十位数,分钟的个位数
}
else
{
printf("%s %s",time[h],time[m]);//直接输出就好
}
}
return 0;
}
题目三:
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
1:两个字符串长度不等。比如Beijing和Hebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如Beijing和Beijing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如beijing和BEIjing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如Beijing和Nanjing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入
在第一行输入一个字符串,在第二行再输入一个字符串,字符串长度介于1到10之间。
输出
在一行输出一个整数,即这两个字符串的关系编号。
输入样例 1
BEIjing
beiJing
输出样例 1
3
思路:
之前我的博客有讲解,我的资料有总结,如果你看到这篇的话,在我之前的博客没有找到一个技巧叫做判断分割的话,证明你来晚了,资料我3个月后把那篇删除,要的话留言或者咸鱼找我;
代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
char str1[15],str2[15];
int main()
{
int len1,len2;
int i;
scanf("%s%s",str1,str2);
len1=strlen(str1);
len2=strlen(str2);
if(len1!=len2)//长度相等一个大o,那么直接输出就行,不含龙根(口诀)
printf("1\n");
else if(strcmp(str1,str2)==0)//如果不是的话,就3o要胖(口决)
printf("2\n");//完全一样的话就输出2
else
{
for(i=0;i<len1;i++)
if(str1[i]!=str2[i]&&abs(str1[i]-str2[i])!=32)
break;
if(i==len1)
printf("3\n");
else
printf("4\n");
}
return 0;
}
技巧:判断字符串是否区分大小写后才使得字符串成立,只要判断2个值的差值是否为32就好了
题目四:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
在第一行输入两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个正整数,表示这个矩阵。
输出
在一行输出mn个整数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
输入样例 1
3 3
1 2 3
4 5 6
7 8 9
输出样例 1
1 4 7 8 9 6 3 2 5
输入样例 2
3 2
1 2
3 4
5 6
输出样例 2
1 3 5 6 4 2
思路:
利用位置数组,注意如果转弯后要转弯并且往下走一步,套模板就好了
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
int a[210][210];
int p[210][210];
int dirx[4]={
1,0,-1,0};
int diry[4]={
0,1,0,-1};
int main()
{
int m,n,x=0,y=0,t=0,d=1;
scanf("%d %d",&m,&n);
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
scanf("%d",&a[i][j]);
}
}
while(d<=m*n)
{
printf("%d ",a[x][y]);
p[x][y]=1;
int tx=x+dirx[t];
int ty=y+diry[t];
if(tx<0||tx>=m||ty<0||ty>=n||p[tx][ty]==1)
{
t=(t+1)%4;
tx=x+dirx[t];
ty=y+diry[t];
}
x=tx;
y=ty;
d++;
}
return 0;
}
题目五:
给定一个N阶方阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入
在第一行输入两个正整数N和M(1<=N<=30, 0<=M<=5),表示方阵A的阶数和要求的幂数,N和M用空格隔开。
接下来N行,每行输入N个绝对值不超过10的非负整数,整数之间用空格隔开,描述方阵A的值。
输出
输出共N行,每行N个整数,表示A的M次幂所对应的方阵。相邻的数之间用一个空格隔开。
输入样例 1
2 2
1 2
3 4
输出样例 1
7 10
15 22
思路:
需要整理
代码:
#include <stdio.h>
#include <string.h>
#define N 100
int A[N][N],t[N][N],r[N][N];
int main()
{
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&A[i][j]);
for(i=0;i<n;i++)
r[i][i]=1;
while(m--)
{
memset(t,0,sizeof(t));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
t[i][j]+=r[i][k]*A[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
r[i][j]=t[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",r[i][j]);
printf("\n");
}
return 0;
}
题目六:
Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
十二亿三千四百五十六万七千零九
用汉语拼音表示为
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
这样他只需要照着念就可以了。
你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
注意必须严格按照规范,比如说“10010”读作“yiwan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。
输入
在一行输入一个正整数,数值大小不超过2,000,000,000。
输出
在一行输出一个由小写英文字母和空格组成的字符串,表示该数的英文读法。
输入样例 1
1234567009
输出样例 1
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
思路:
判断位数,分情况
先读这个位置的数字是多少,如果是o的话输出跳过,如果不是的话就输出这个位置的数字是什么,再输出位数
代码
#include <stdio.h>
#include <string.h>
char *s[15]={
"0","1","shi","bai","qian","wan","yi"};//位数读什么
char *num[10]={
"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char s1[10010];
int main()
{
scanf("%s",s1);
int pos=strlen(s1);
if(pos<=4)
{
int poss=pos;
for(int i=0;i<pos;++i)
{
if(i==pos-1)
{
if(num[s1[i]-'0']=="ling") return 0;
else printf("%s",num[s1[i]-'0']);
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']=="ling")
{
poss--;
continue;
}
else
{
printf("%s ",s[poss--]);
}
}
}
}
else if(pos>4&&pos<=8)
{
int poss1=4,i;
int poss2=pos-4,poss22=poss2;//读入千位数之前的
for(i=0;i<poss2;++i)
{
if(i==poss2-1)
{
if(num[s1[i]-'0']!="ling")
{
printf("%s ",num[s1[i]-'0']);
}
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']!="ling")
{
printf("%s ",s[poss22--]);
}
else
{
poss22--;
continue;
}
}
}
printf("wang ");
for(int j=1;j<=4;++j,++i)
{
if(j==4)
{
if(num[s1[i]-'0']!="ling")
{
printf("%s ",num[s1[i]-'0']);
}
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']!="ling")
{
printf("%s ",s[poss1--]);
}
else
{
poss1--;
}
}
}
}
else if(pos>8&&pos<=10)
{
int poss3=pos-8,poss33=poss3,i;
for(i=0;i<poss3;++i)
{
if(i==poss3-1)
{
if(num[s1[i]-'0']!="ling")
{
printf("%s ",num[s1[i]-'0']);
}
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']!="ling")
{
printf("%s ",s[poss33--]);
}
else
{
poss33--;
}
}
}
printf("yi ");
for(int j=0;j<4;++i,++j)
{
if(j==3)
{
if(num[s1[i]-'0']!="ling")
{
printf("%s ",num[s1[i]-'0']);
}
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']!="ling")
{
printf("%s ",s[4-j]);
}
}
}
printf("wang ");
for(int p=0;p<4;++p,++i)
{
if(p==3)
{
if(num[s1[i]-'0']!="ling")
{
printf("%s ",num[s1[i]-'0']);
}
}
else
{
printf("%s ",num[s1[i]-'0']);
if(num[s1[i]-'0']!="ling")
{
printf("%s ",s[4-p]);
}
}
}
}
return 0;
}
代码二:
#include<stdio.h>
int main()
{
char *num[] = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
char *wei[] = {
"shi", "bai", "qian", "wan", "yi"};
char *str[20];
int i, j, k, n, l[2] = {
0};
i = 0;
j = 0;
scanf("%d", &n);
while(n > 0)
{
k = n % 10;
n /= 10;
if(k > 0)
{
if(i > 0)
{
if(i >= 4 && !l[i / 4 - 1])
{
l[i / 4 - 1] = 1;
str[j++] = wei[i / 4 + 2];
}
if(i % 4 != 0)
str[j++] = wei[i % 4 - 1];
}
str[j++] = num[k];
}
else if(j > 0 && str[j - 1] != num[0])
{
str[j++] = num[0];
}
i++;
}
if(!(str[j - 1] == "yi" && j > 1 && str[j - 2] == "shi"))
printf("%s ", str[j-1]);
for(i = j - 2; i >= 0; i--)
printf("%s ", str[i]);
return 0;
}