1. 程式人生 > >尋找連續數中丟失的數

尋找連續數中丟失的數

題目如下:

現在有一個數組,其值為從1到10000。由於某次偶然操作,導致這個陣列中丟失了某三個元素,同時順序被打亂,現在需要你用最快的方法找出丟失的這三個元素,並且將這三個元素根據從小到大重新拼接為一個數字,計算其除以7的餘數。

例:丟失的元素為336, 10, 8453,得到的新數字為10368453,除以7的餘數為2.

輸入資料為一行,包含9997個數字,空格隔開。

輸出為一行,包含一個數字。

題目要求用最快的方法去做,但是我沒有深入的思考,用了比較簡單的方法去做。思路大概是這樣:

1.將輸入的資料存放在陣列arr中並從按小到大排序。

2.定義一個變數i從1增長到10000,一個記錄陣列arr下標的指標j,將陣列中的元素和i的值比較,如果arr[j]  不等於 i 說明 i 就是丟失的數。(7考慮連續丟失的數)接著讓 i自增,直到 i 與 arr[j] 相等,j++,i++。還有一個要注意的問題是,丟失的數超過9997,就要控制 j 的增長 否則會出現陣列越界問題。

3.將找到的丟失的數排序,轉換為字串,再拼接起來轉換為整數,在這裡就偷懶了直接調sprintf函式,strcat函式和atoi函式

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define TOTAL 9997
void FindTheNum(int *arr, int length, int *find);
void my_sort(int *arr, int length);


int main()
{
	int i , j;
	int num[TOTAL];
	int find[3];
	char str[100];
	char temp_str[100];
	
	for(i = 0 ; i < TOTAL; i++)
	{
		scanf("%d", &num[i]);
	}

	 my_sort(num, TOTAL); 
	 FindTheNum(num, TOTAL, find);
	 my_sort(find, 3);
	
	 memset(str, '\0', sizeof(str));
	 for(i = 0; i < 3; i++)
	 { 
	 	sprintf(temp_str, "%d", find[i]);
	 	strcat(str,temp_str);
	 }	 
	 printf("%d\n", atoi(str) %7);
	 
	return 0;
}

void my_sort(int *arr, int length)

{
	int i, j, temp;
	if(arr == NULL)	return;
	
	for(i = 0; i < length; i++)
	{
		for(j = i+1; j < length; j++)
		{
			if(arr[i] > arr[j])
			{
				 temp = arr[i];
				 arr[i] = arr[j];
				 arr[j] = temp;
			}
		}
	}
	
}

void FindTheNum(int *arr, int length, int *find)
{
	int i = 0;
	int j = 0;
	int k = 0;
	for(i = 1; i <= length + 3 ; i++)	
	{
		while(i != arr[j])
		{
			find[k++] = i++;
			if(k == 3) return;
		}
		if(j+1 < length) j++;		
	}	
}