程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1002 487-3279

POJ 1002 487-3279

編輯:C++入門知識

【題意簡述】:中文題,不再贅述!

【思路】:(1)、首先,將各種電話號碼表示轉換成標准表示:一個長度為 8 的字符串,前三個字符是數字、第 4 個字符是'-'、後四個字符是數字。

(2)、根據電話號碼的標准表示,搜索重復的電話號碼。辦法是對全部的電話號碼進行排序,這樣相同的電話號碼就排在相鄰的位置。此外,題目也要求在輸出重復的電話號碼時,要按照號碼的字典升序進行輸出。


因此:

用一個二維數組 p[100000][9]來存儲全部的電話號碼,每一行存儲一個電話號碼的標准表示。每讀入一個電話號碼,首先將其轉換成標准表示,然後存儲到二維數組telNumbers 中。全部電話號碼都輸入完畢後,將數組 p作為一個一維數組,其中每個元素是一個字符串,用C/C++提供的函數模板sort對進行排序。用字符串比較函數strcmp比較 p 中相鄰的電話號碼,判斷是否有重復的電話號碼、並計算重復的次數。

// 1024K 375Ms
#include
#include
#include
char m[]="22233344455566677778889999";
char p[100000][9],buf[1000];
int i,j,k,n,count,duplicate;

int compare(const void *elem1,const void *elem2)
{
	return (strcmp( (char*)elem1,(char*) elem2));
};
int main()
{
    scanf("%d\n",&n);
    for(i=0;i='A'&&buf[j]<='Z')
            {
                p[i][k]=m[buf[j]-'A'];
            }
            else if(buf[j]>='0' && buf[j]<='9')
            {
                p[i][k]=buf[j];
            }
            if(++k==3)
                p[i][k++]='-';//在第三位插入連字符
        }
    }
    qsort(p,n,9,compare);//對輸入的電話號碼進行排序
    duplicate=0;//0=沒有重復,1=有重復的
    count=0;
    for(i=0;++i<=n;)//搜索重復的電話號碼,並進行輸出
    {
        count++;//重復次數
        if(strcmp(p[i-1],p[i]))
        {
            if(count>1)//因為已經排好了序,所以只要遇到不同的就說明重復結束 
            {
                printf("%s %d\n",p[i-1],count); 
                duplicate=1;//只要輸出了1次就設置成0以外的值 
            }
            count=0;//重設出現次數 
        }
    }
    if(duplicate==0)
        puts("No duplicates.");
    return 0;
}




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved