Acm竞赛真题

这个话题和乐理有点关系。题目的主要思想是输入一串或多串半音符(每串用一条线表示,每个半音符用一个空格隔开),然后程序要判断每串音符可能用哪个调号,然后输出(每个调号用一个空格隔开)。

首先明白:

1)半音符顺序是:c C C # D D # E F F # G G # A A # B C...(每两个符号相差半个音符)。

2)大调音阶的定义:八个半音的任意有序序列,可以以任何一个半音开始(这个半音称为这一串音的调号),但这八个半音是按照“全-全半音-全-全半音”的规律选取的,即第一个半音和第二个半音之差。......

因此,程序应首先根据上述定义所有可能的主要尺度,例如:

C调的大调音阶由以下八个半音符组成:

英国皇家航空公司

C#专业:C C# D# F F# G# A# C C#

:D少校

......

对题目中给出的例子的解释:

第一行:C C D F E G A A F G B,去掉重复的半音符后,剩下C D E F G B,然后程序对比所有大调音符,发现唯一能完全包含这七个半音符的调号是C,于是输出“C”。

第二行:A B C D E F G C#,程序对比所有大调,发现调号中没有一个大调能包含所有这八个半音符,所以输出为空。

第三行:C C D F E G A A F G,去掉重复的半音符后,C D E F G A保留,然后程序与所有大调音符进行比较,发现能全部包含这六个半音符的调号有C和F,于是输出“C F”。

第四行:cc cc,去掉重复的半音符后,剩下C,然后程序和所有大调音符对比,发现有七种调号可以包含这个半音符:C,C #,D #,F,G #,G #,A #,于是输出“C C # D # F G G # A #”。