Description
在已经过去了的某一天,优酷视频上一位记者报道了360和百度的搜索战,视频中有这位记者用电话拨打360董事长周鸿祎手机的情节,一位蛋疼的大学生把其中电话拨号的录音给截取下来,通过音频分析得到了周鸿祎的电话号码。
下面是音频分析的原理(来自微博):
我们平常所用的电话,是通过DTMF信号来向交换机传递命令的,我们每按下电话键盘上的一个键,就会同时发出两个不同频率的声音,转化成电流在对面解析(可以回忆柯南剧场版中通过唱歌拨打电话)。也就是说,记者每按下的每个键的声音,实际上是由两个纯粹的音(tone)构成的,通过下面可以看到每个数字由哪两个频率的声音构成。
假设你是这位破译电话号码的大学生,你已经得出了每个按键音的两个频率,请你告诉大家这些频率代表的字符或者数字。
Input
多组数据,每组数据三行,第一行一个整数N(100000>=N>0)代表已经得到的按键音的个数,第二行N个整数,在这一行中,第i个整数代表第i个按键音的高音。第三行N个整数,在这一行中,第i个整数代表第i个按键音的低音。
输入N=0,代表输入结束。
Output
对于每组数据,输出N个字符或数字,代表破译后的字符或数字,按照输入给出的顺序输出,每行23个字符或数字。
Sample Input
3
1209 1209 1336
697 697 941
3
1336 1336 1336
770 697 941
0
Sample Output
110
520
解题思路:
这个题很简单,不如说是科普题。用switch case语句即可。
#include<iostream>
using namespace std;
const int maxN = 100000;
int freLow[maxN],freHigh[maxN];
void print(int freL,int freH)
{
switch(freL+freH)
{
case (697+1209):cout<<1;break;
case (697+1336):cout<<2;break;
case (697+1477):cout<<3;break;
case (697+1633):cout<<"A";break;
case (770+1209):cout<<4;break;
case (770+1336):cout<<5;break;
case (770+1477):cout<<6;break;
case (770+1633):cout<<"B";break;
case (852+1209):cout<<7;break;
case (852+1336):cout<<8;break;
case (852+1477):cout<<9;break;
case (852+1633):cout<<"C";break;
case (941+1209):cout<<"*";break;
case (941+1336):cout<<0;break;
case (941+1477):cout<<"#";break;
case (941+1633):cout<<"D";break;
}
}
int main()
{
int N;
while(cin>>N)
{
if(N==0)
break;
for(int i=0;i<N;++i)
cin>>freLow[i];
for(int i=0;i<N;++i)
cin>>freHigh[i];
for(int i=0;i<N;++i)
{
if(i%23==0&&i!=0)
cout<<endl;
print(freLow[i],freHigh[i]);
}
cout<<endl;
}
return 0;
}
最后欢迎大家访问我的个人网站: 1024s