統計の電話番号

統計の電話番号

企業は、電話番号を覚えておくことは容易で使用することを好みます。単語やフレーズを覚えておくことは容易で書かれている覚えておく方法の電話番号を確認します。あなたはウォータールー大学を呼び出すために必要がある場合たとえば、あなたがTUT-GLOPを呼び出すことができます。時には、電話番号のみの部品番号は、言葉を綴りました。あなたが夜にホテルに戻って取得するときには、310-GINOをダイヤルすることにより、ジーノのにピザを注文することができます。覚えておくために電話番号を作るための別の方法は、番号の桁がグループ化されて覚えて良い方法であることです。ピザハットの3-10-10-10をダイヤルする「3 10」の数によって、あなたは彼らからピザを注文することができます。
標準フォーマットの電話番号は、7進数、第3及び第4桁の間のコネクタです。電話ダイヤルは次のようにマッピング関係は、数字に文字からのマッピングを提供する:A、B、及びC 2 D、Eにマッピングされ、そしてFれる3 G、Hにマッピングされ、そしてIは、J、K 4にマッピングされ、そしてLがマッピングされていますN、M 5、およびOマッピングP、R 6、及びSが7 T、U、およびVにマッピングされる8 W、X、およびYにマッピングされる9 QおよびZにマッピングされているが、任意の数にマッピングされていない、ハイフンではありませんダイヤルアップが必要で、追加し、任意の削除を行うことができます。TUT-GLOPは、標準的なフォーマットは310-4466,3-10-10-10は310から1010である標準フォーマット888-4567,310-GINO標準フォーマットです。二つの数が同じ標準フォーマットを持っている場合、それらは同一である(同じダイヤルアップ)している
会社が地元企業のための電話帳を書いています。品質管理の一環として、次の2つの多くの企業は、同じ電話番号を持っているがあるかどうかを確認したいです。
入力:入力の形式、最初の行は、電話帳番号(100,000まで)に数値を指定する正の整数です。行ごとに残りの1つは、電話番号です。各電話番号は、(QおよびZを除く)数と大文字で構成され、構成されるコネクタ
出力:各出現繰り返し数が出力の一行を生成、出力数の標準フォーマットが空間とその繰り返しが続きです。辞書の数に応じて昇順に重複出力番号が複数存在する場合。重複する番号が存在しない場合は、出力ライン:
重複なしません。

コード

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 char map[]="22233344455566677778889999";  //Q和Z先正常考虑,如若不考虑,对应关系就会受到影响。
 char str[80],telNumbers[100000][9];
 int compare(const void *elem1,const void *elem2)  //const修饰指向的对象,A可变,A指向的对象不可变
 	 //为函数模板sort定义数组元素的比较函数 
 {
 	 return(strcmp((char*)elem1,(char*)elem2)); 
 };
 void standardizeTel(int n)//是一个函数,使标准化,规格化 。简洁易读。
 {
 	int j,k; 	
 	j=k=-1;//... 
 	while(k<8)
 	{
 		j++;
		 if(str[j]=='-')	
 			continue;
 		k++;
 		if(k==3)
 		{
 			telNumbers[n][k]='-';
 			k++;
		 }
		 if(str[j]>='A'&&str[j]<='Z') 
		 {
		 	telNumbers[n][k]=map[str[j]-'A'];
		 	continue;
		 };
		 telNumbers[n][k]=str[j];	
	} 
	telNumbers[n][k]='\0';
	return;
 }
 int main()
 {
 	int n,j,i;
 	bool noduplicate;
 	
 	scanf("%d",&n);
 	for(i=0;i<n;i++)	//输入电话号码,储存到数组telNumbers中
 	{
		 scanf("%s",str);
		 standardizeTel(i);//将str中的电话号码转化成标准形式 ,储存在telNumbers中第i行 
	 }
	 qsort(telNumbers,n,9,compare);//对输入的电话号码进行排序
	  noduplicate=true;//对布尔变量赋值true 
	  i=0;
	  while(i<n)//搜索重复的电话号码,并进行输出
	  {	 
	   j=i;//j用来记录原来的位置 
	  i++;
	  while(i<n&&strcmp(telNumbers[i],telNumbers[j])==0) i++;//相邻的比较,相同则i加一,此时是已经排序了的
	  if(i-j>1)  //大于1说明存在相同的两行 
	  {
	  	printf("%s%d\n",telNumbers[j],i-j);
		noduplicate=false;
	   } 	
	   } 
	 if(noduplicate) printf("No duplicates.\n");
}

分析
入力決定重複電話番号(1)のための数:標準表現に様々な電話番号の表記:「 - 」、後に8文字の文字列は、最初の3つの図であり、最初の4つの文字であります4つの文字は数字です。
(2)二次元アレイtelNumbersを[100000] [9]全体電話番号、各列に格納された電話番号を格納するために
、標準的な表現を。各電話番号は、それが最初の標準的な表現に変換された後、二次元配列に格納され、読み出される
でtelNumbers。
(3)の各要素は、C / C ++ソートを提供した文字列、ソート関数テンプレートである一次元アレイとしてtelNumbers。文字列比較関数のstrcmp telNumbers隣接電話番号と比較し、重複した電話番号があるかどうかを決定し、繰り返し回数を算出します。
概要
(1)まず、この質問の主題長くはキーポイントを識別するために、慎重な分析が必要です。第二に、関連する問題は、多くのフォームより文字でより便利に、より明確に変換する方法を検討する必要があります。
(2)この問題を解決するために、より多くの我々は、機能を使用します。初心者として、あなたはあまりにも多くを知っている必要があります。
ソート()内のヘッダファイル<アルゴリズム>に定義されています。ソート機能は、標準テンプレートライブラリの関数である、アドレスの開始と終了は、任意の要素、任意の条件、実行速度がqソートよりも一般的に高速である任意の容器は、(ランダムイテレータが満たさなければならない)比較のために使用することができ、並べ替えることが知られており、かなりそのアップグレード版インチ さらに、ソート()一般的な関数であり、任意の容器、任意の要素、任意の条件を比較するために使用することができます。
int型の比較(のconst void *型elem1、 CONST void *型のElem2) のqsort比較関数です。
strcmpのは()も比較関数です。
**)(**標準化プログラムの単純明快な構造を作ります。

おすすめ

転載: blog.csdn.net/m0_45128748/article/details/91781237