位統計法的應用

本文根據微信公衆號算法糰子的文章總結得到。

題目描述:在一堆正整數中,有一個數恰好出現了B次,而其他的數均出現了A次,一共N個數,求出那出現B次的數,數據保證有解,設題目的輸入爲:第一行3個正整數,n,a,b(b<a),第二行n個正整數,所有的數均在int範圍之內。輸出那個出現b次的數。


分析:採用位統計法解決此類問題。所有數的大小都在int範圍內,所以數字的長度不超過10位,開一個10*10的二維數組,用來統計,所有數字中出現在從第一位(個位)到第10位每一位上0~9這個10個數字每個數字出現的次數。


由於只有一個數出現了b次,其他數都出現了a次,因此而且b<a,因此出現了b次的數字各個位上的數字要麼與其他數有重合,會出現a*K+b次,b<a,要麼不重合,出現b次,因此無論有沒有重合,對a取餘的結果都爲b,,根據這一點,將這個數字的各個位上的數字求得組成即可,源代碼如下

<pre name="code" class="cpp">#include<stdio.h>

int main()
{
	int n,a,b;
	scanf("%d%d%d\n",&n,&a,&b);//吃掉換行符
	int cnt[10][10]={0};
	int i,j;
	for(i=0;i<n;i++){
		char ch;
		j=0;
		while((ch=getchar())>47)
			cnt[j++][ch-48]++;  //這條語句具有一定的技巧性,直接得到數字的統計數量 
	}
	//輸入結束後,即可得到所有數字各個位上數字之和。
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)
		{
			if(cnt[i][j]%a==b)
				printf("%c",j+'0');  //這條語句的技巧在於可以直接得到重新組合的數字。 
		} 
		
	printf("\n");
	
}

測試

輸入:

10  4  2

55 67 55 67 67 76 76 67 76 76

輸出:

55

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章