电话号码 C语言

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36718690/article/details/78024221

题目就不说了。作为算法小白的我。直接来了一发,简单简单粗暴的。100万的数组走起。哈哈,OJ一掌拍回。LTE,LTE,LTE,LTE。。。。。。WA都 WA不出。改改改,LTE,LTE。不是方法太low是啥。用户的CPU是我的。。。。。。不得不向百度爸爸低头,原来还有个位图法(参考网站脚本之家),长见识了。一个 Int 可以占有32位,每一位就可以记录一个号码存在与否的信息 ,由于只有3与6开头,各有100万(N)个:int 0000 0000 0000 0000 0000 0000比如3开头的就只需要一个int bit[N/32+1]的数组,怎么存入信息呢?比如3456789 他的bit下标就是i=456789/32=14274,由于456789%32=21那么就把从右往左的第22位置为1通过位运算bit[i] |= 1<<(4567897&31)就可以。
然后来了一发
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
#define N 1000000
#define M 21
#define R 9
#define Q 1510
int bit[ N / 32 + 1];
int bit2[N / 32 + 1];
struct numbers
{
	long number;
	int  amount;
};
struct numbers store[Q];
char afterTrans[R];
int main()
{
	char * transToStd2(long num);
	long transToNum(char input[M]);
	char *transToStd(char input[M]);
	for (int i = 0; i < Q; i++)
		store[i].amount = 1;
	int isAnError(char input[M]);
	char *transToStd(char input[M]);
	char input[M];
	long error = 0;
	int totalAmount = 0;
	printf("Error:\n");
	gets(input);
	do
	{
		//printf("isAnError(input):%d\n", isAnError(input));
		if (isAnError(input) == 1)//??
		{
			error++;
			printf("%s\n", input);
		}
		else
		{
		//	printf("test  num:%d  std:%s\n", transToNum(input),transToStd(input));
			int flag = 0;
			long inputNum = transToNum(input);
			if (inputNum >= 3 * N && inputNum < 4 * N)
			{
				inputNum -= 3 * N;
				if ((bit[inputNum / 32] & (1 << inputNum % 32)) >0)// 判重 
				{
					for (int j = 0; j < totalAmount; j++)
					{
						if (transToNum(input) == store[j].number)//计数 
						{
							store[j].amount += 1;
							flag = 1;
						}
					}
					if (flag == 0)//存入新的重复号码 
						store[totalAmount++].number = transToNum(input);
				}
				else//不重则相应位置为1 
					bit[inputNum / 32] |= (1 << (inputNum % 32));
			}
			if(inputNum >= 6 * N && inputNum < 7 * N)
			{
				inputNum -= 6 * N;
				if ((bit2[inputNum / 32] & (1 << inputNum % 32)) >0)
				{
					for (int j = 0; j < totalAmount; j++)
					{
						if (transToNum(input) == store[j].number)
						{
							store[j].amount += 1;
							flag = 1;
						}
					}
					if (flag == 0)
						store[totalAmount++].number = transToNum(input);
				}
				else
					bit2[inputNum / 32] |= (1 << (inputNum % 32));
			}
			//duplication judge and store
			//printf("bit[inputNum / 32] & (1 << inputNum % 32):%ld\n", bit[inputNum / 32] & (1 << inputNum % 32));
		}
	} while (gets(input) != NULL);
	//printf("totalAmount:%d\n", totalAmount);
	//printf("Test!!!!!!!\n");
	//for (int i = 0; i < index; i++)
	//printf("standard:%s\n", standard[i]);
	if (error == 0)
		printf("Not found.\n");
	printf("\n");
	//sort
	int cmp(const void *a, const void *b);
	qsort(store, totalAmount, sizeof(struct numbers), cmp);
	printf("Duplication:\n");
	if(totalAmount == 0)
		printf("Not found.\n");
	else
		for (int i = 0; i < totalAmount; i++)
			printf("%s %d\n", transToStd2(store[i].number),store[i].amount+1);
}

char * transToStd2(long num)
{
	afterTrans[R - 1] = '\0';
	for (int i = R - 2; i >= 0; i--)
	{
		if (i == 3)
		{
			afterTrans[i] = '-';
			continue;
		}
		else
		{
			afterTrans[i] = num % 10 + '0';
			num = num / 10;
		}
	}
	return afterTrans;
}

int isAnError(char input[M])
{
	int flag = 0;
	// Is it inclde Q or Z?
	for (int i = 0; i < strlen(input); i++)
	{
		if (input[i] == 'Q' || input[i] == 'Z')
		{
			flag = 1;
			break;
		}
	}
	if (flag == 1)
		return flag;
	else
	{
		int first = 0;
		for(int i=0;i<strlen(input);i++)
			if (input[i] != '-')
			{
				first = i;
				break;
			}
		//printf("input[first] %c\n", input[first]);
		if (input[first] == '3' || input[first] == '6' || input[first] == 'D' || input[first] == 'F' || input[first] == 'E' || input[first] == 'M' || input[first] == 'N' || input[first] == 'O')
			flag = 0;
		else
			flag = 1;
	}
	return flag;
}

char *transToStd(char input[M])
{
	int index = 0;
	for (int i = 0; i < strlen(input); i++)
	{
		// remove extral -
		if (input[i] == '-'&&i != 3)
			continue;
		else
		{
			if (input[i] >= '0'&&input[i] <= '9' || input[i] == '-')
				afterTrans[index++] = input[i];
			else
			{
				if (input[i] == 'A' || input[i] == 'B' || input[i] == 'C')
					afterTrans[index++] = '2';
				else if (input[i] == 'D' || input[i] == 'E' || input[i] == 'F')
					afterTrans[index++] = '3';
				else if (input[i] == 'G' || input[i] == 'H' || input[i] == 'I')
					afterTrans[index++] = '4';
				else if (input[i] == 'J' || input[i] == 'K' || input[i] == 'L')
					afterTrans[index++] = '5';
				else if (input[i] == 'M' || input[i] == 'N' || input[i] == 'O')
					afterTrans[index++] = '6';
				else if (input[i] == 'P' || input[i] == 'R' || input[i] == 'S')
					afterTrans[index++] = '7';
				else if (input[i] == 'T' || input[i] == 'U' || input[i] == 'V')
					afterTrans[index++] = '8';
				else
					afterTrans[index++] = '9';
			}
		}
	}
	if (afterTrans[3] != '-')
	{
		for (int i = R - 2; i > 3; i--)
			afterTrans[i] = afterTrans[i - 1];
		afterTrans[3] = '-';
	}
	afterTrans[R - 1] = '\0';
	return afterTrans;
}

long transToNum(char input[M])
{
	long num = 0;
	strcpy(afterTrans, transToStd(input));
	//remove '-'.
	for (int i = 3; i <= R - 3; i++)
		afterTrans[i] = afterTrans[i + 1];
	afterTrans[R - 2] = '\0';
	//trans to number.
	for (int i = 0; i < R - 2; i++)
		num+=(afterTrans[i]-'0')*pow(10,R-2-i-1);
	return num;
}

int cmp(const void *a, const void *b)
{
	return ((struct numbers *)a)->number-((struct numbers *)b)->number;//number from smaller to bigger
}

过了两个样例,后两列LTE
都是泛滥的函数调用造成的,还有缓慢的pow

然后又来一发
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
#define N 1000000
#define M 21
#define R 9
#define Q 1510
int bit[N / 32 + 1];
int bit2[N / 32 + 1];
int dec[10];
struct numbers
{
	long number;
	int  amount;
};
struct numbers store[Q];
char afterTrans[R];
int main()
{
	dec[0] = 1;
	for (int i = 1; i <= 9; i++)dec[i] = dec[i - 1] * 10;
	char * transToStd2(long num);
	long transToNum(char input[M]);
	for (int i = 0; i < Q; i++)
		store[i].amount = 1;
	int isAnError(char input[M]);
	char input[M];
	long error = 0;
	int totalAmount = 0;
	printf("Error:\n");
	gets(input);
	do
	{
		//printf("isAnError(input):%d\n", isAnError(input));
		if (isAnError(input) == 1)//判错
		{
			error++;
			printf("%s\n", input);
		}
		else
		{
			//printf("test  num:%d\n", transToNum(input));
			int flag = 0;
			long inputNum = transToNum(input);
			if (inputNum >= 3 * N && inputNum < 4 * N)
			{
				inputNum -= 3 * N;
				if (bit[inputNum / 32] & (1 << (inputNum & 31)))// 判重
				{
					for (int j = 0; j < totalAmount; j++)
					{
						if (inputNum == store[j].number)//计数
						{
							store[j].amount += 1;
							flag = 1;
						}
					}
					if (flag == 0)//存重
						store[totalAmount++].number = inputNum;
				}
				else
					bit[inputNum / 32] |= (1 << (inputNum & 31));
			}
			if (inputNum >= 6 * N && inputNum < 7 * N)
			{
				inputNum -= 6 * N;
				if (bit2[inputNum / 32] & (1 << (inputNum & 31)))
				{
					inputNum += 1000000;
					for (int j = 0; j < totalAmount; j++)
					{
						if (inputNum == store[j].number)
						{
							store[j].amount += 1;
							flag = 1;
						}
					}
					if (flag == 0)
						store[totalAmount++].number = inputNum;
				}
				else
					bit2[inputNum / 32] |= (1 << (inputNum & 31));
			}
			//duplication judge and store
			//printf("bit[inputNum / 32] & (1 << inputNum % 32):%ld\n", bit[inputNum / 32] & (1 << inputNum % 32));
		}
	} while (gets(input) != NULL);
	//printf("totalAmount:%d\n", totalAmount);
	//printf("Test!!!!!!!\n");
	//for (int i = 0; i < index; i++)
	//printf("standard:%s\n", standard[i]);
	if (error == 0)
		printf("Not found.\n");
	printf("\n");
	//sort
	int cmp(const void *a, const void *b);
	qsort(store, totalAmount, sizeof(struct numbers), cmp);
	printf("Duplication:\n");
	if (totalAmount == 0)
		printf("Not found.\n");
	else
		for (int i = 0; i < totalAmount; i++)
			printf("%s %d\n", transToStd2(store[i].number), store[i].amount + 1);
}

char * transToStd2(long num)
{
	afterTrans[R - 1] = '\0';
	for (int i = R - 2; i >= 0; i--)
	{
		if (i == 3)
		{
			afterTrans[i] = '-';
			continue;
		}
		else
		{
			afterTrans[i] = num % 10 + '0';
			num = num / 10;
		}
	}
	if (afterTrans[0] == '0')afterTrans[0] = '3';
	if (afterTrans[0] == '1')afterTrans[0] = '6';
	return afterTrans;
}

int isAnError(char input[M])
{
	int flag = 0;
	// Is it inclde Q or Z?
	int l = strlen(input);
	for (int i = 0; i < l; i++)
	{
		if (input[i] == 'Q' || input[i] == 'Z')
		{
			flag = 1;
			break;
		}
	}
	if (flag == 1)return flag;
	else
	{
		int first = 0;
		for (int i = 0; i<l; i++)
			if (input[i] != '-')
			{
				first = i;
				break;
			}
		//printf("input[first] %c\n", input[first]);
		if (input[first] == '3' || input[first] == '6' || input[first] == 'D' || input[first] == 'F' || input[first] == 'E' || input[first] == 'M' || input[first] == 'N' || input[first] == 'O')flag = 0;
		else flag = 1;
		if (flag == 1)return 1;
		int tt = 0;
		for (int i = 0; i < l; i++)
		{
			if (input[i] != '-'&&input[i] != 'Q'&&input[i] != 'Z')tt++;
		}
		flag |= (tt != 7);
	}
	return flag;
}
long transToNum(char input[M])
{
	long num = 0;
	int n = 6;
	for (int i = 0; i < strlen(input); i++)
	{
		if (input[i] == 'A' || input[i] == 'B' || input[i] == 'C')
			num += 2 * dec[n--];
		else if (input[i] == 'D' || input[i] == 'E' || input[i] == 'F')
			num += 3 * dec[n--];
		else if (input[i] == 'G' || input[i] == 'H' || input[i] == 'I')
			num += 4 * dec[n--];
		else if (input[i] == 'J' || input[i] == 'K' || input[i] == 'L')
			num += 5 * dec[n--];
		else if (input[i] == 'M' || input[i] == 'N' || input[i] == 'O')
			num += 6 * dec[n--];
		else if (input[i] == 'P' || input[i] == 'R' || input[i] == 'S')
			num += 7 * dec[n--];
		else if (input[i] == 'T' || input[i] == 'U' || input[i] == 'V')
			num += 8 * dec[n--];
		else if (input[i] == 'W' || input[i] == 'X' || input[i] == 'Y')
			num += 9 * dec[n--];
		else if (input[i] >= '0'&&input[i] <= '9')
			num += (input[i] - '0') * dec[n--];
		else continue;
	}
	return num;
}

int cmp(const void *a, const void *b)
{
	return ((struct numbers *)a)->number - ((struct numbers *)b)->number;//number from smaller to bigger
}


开心,
虽然已经是折扣时间了。

猜你喜欢

转载自blog.csdn.net/qq_36718690/article/details/78024221