序列中的衆數

/*
求序列中的衆數
查看 提交 統計 提問
總時間限制: 1000ms 內存限制: 65536kB
描述
輸入一個長度爲N的整數序列 (不多於128個整數),每個整數的範圍在[-10^52,10^52],計算這個序列的衆數。 

衆數是指出現次數最多的那個數。 

如果有多個數出現的次數都達到最多,則取在原序列最先出現的數爲衆數;如果所有的數都相等,則返回"no"。

輸入
第一行爲序列長度N。

然後是N個數據,每一個數的範圍都是在[-10^52,10^52]。 注意,這N個數之間可能有若干個空行隔開。

注意,輸入數據可能有一些冗餘表達信息,具體來說:

1) 正數和0前面可能有前導0和'+'符號,例如
+000123=123
+0000=0
-0000=0
2)每個數字中不含有空格和其他非數字字符,例如不會出現"100 0"或者"- 100"。
3)每個數字前面至多有一個符號,即不會出現+(-1)、-(+4)和-(-1)等情況。
輸出
輸出只有 1 行:

該序列的衆數或者”no”。

如果有多個數出現的次數都達到最多,則取最先出現的數爲衆數,並且輸出形式應該最簡形式。

例如,如果原序列衆數爲+000123,則輸出123;如果原序列衆數爲+0000或者-0000或者0000,輸出0。

負數正常輸出,例如:如果原序列衆數爲-000000001111,就輸出-1111。
樣例輸入
6
-00001
10000
00011111111111111111111111111111111111
-01
+000000011111111111111111111111111111111111
-00000000000001
樣例輸出
-1
————————————————————————————美麗的分割線——————————————————————————————
思路:
將輸入的每個數字進行標準化處理,便於比較
然後對每個數字,將其與之後的所有數字比較,如果相同,那麼將該數字的與之相同數的數目加一
最後遍歷所有數字的相同數,找出擁有最大相同數的數字即可輸出
注意:所有的大數均用char型數組儲存,比較,輸出
*/
#include <iostream>
#include<cstring>
using namespace std;

int process(char a[10000])//用於處理數字,使之具有相同的格式,方便比較數字是否相同
{
	int b=strlen(a);//計算數字的長度
	if(isdigit(a[0])!=0)//給數字強制添上正負號 ,
						//isdigit()檢查字符是否是0~9中的數,返回true或NULL
	{
		b++;
		for(int i=b;i>0;i--)
			a[i]=a[i-1];
		a[0]='+';
	}
	bool p=0;//判斷是不是0
	for(int i=1;i<b;i++)
		if((a[i]=='0')&&(p==0))//把無用的0刪去
		{
			b--;
			for(int j=i;j<=b;j++)
				a[j]=a[j+1];
			i--;
		}
		else
			p=1;//防止誤刪
	if(p==0)//全是0,就讓數字變爲沒有符號的0
	{
		a[0]='0';
		b=1;
	}
	return b;//返回數字的長度(算符號)
}

void out(char a[100],int l)//控制輸出的函數
{
	bool p=0;//判斷是不是全0
	for(int i=1;i<l;i++)
		if(a[i]!='0')
			p=1;
	if(p==0)
		cout<<"0"<< endl;
	else
	{
	    if(a[0]=='+')//把多餘的加號刪去
		    for(int i=0;i<l;i++)
			    a[i]=a[i+1];
	    cout<<a;
	}
}

int main() {
	int n;
	cin>>n;
	char s[100][100];//用於儲存數字
	int length[100],num[100];
	memset(num,0,400);//重置計數數組
	for(int i=0;i<n;i++)
	{
		cin>>s[i];
		length[i]=process(s[i]);//處理數字,length記載數字的長度;
	}
	for(int i=0;i<n;i++)//比較數字是否相同,並計算從它開始往後的相同個數
		for(int j=i;j<n;j++)
		{
			if(length[i]==length[j])
			{
				bool p=0;
				for(int k=0;k<length[i];k++)
					if(s[i][k]!=s[j][k])
						p=1;
				if(p==0)			 //如果不同,s[i]擁有的相同數加一
					num[i]++;
			}
		}
	int max1=num[0],max2=0;//尋找衆數
	for(int i=1;i<n;i++)
		if(num[i]>max1)
		{
			max1=num[i];
			max2=i;
		}
	if(max1==n)//如果從頭到尾只有一個數(也就是沒有衆數),就輸出no
		cout<<"no"<<endl;
	else//否則正常輸出
	    out(s[max2],length[max2]);
	system("pause");
	return 0;
}

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