学校的算法训练营----第一天

题目一:
给定一个以秒为单位的时间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;
}

猜你喜欢

转载自blog.csdn.net/m0_51373056/article/details/113142582