常见算法锦集

1. 字符串转化为整型

  1. int charToInt(const char* str)  
  2. {  
  3.     if (str == NULL) return 0;  
  4.   
  5.     int flag = 1;  
  6.     if ( *str == '+' )  
  7.     {  
  8.         ++str;  
  9.     } else if (*str == '-')  
  10.     {  
  11.         flag = -1;  
  12.         ++str;  
  13.     }  
  14.   
  15.     int n = 0;  
  16.     while ( *str != '\0' )  
  17.     {     
  18.         if ( *str < '0' || *str > '9' )  
  19.             return -9999;       //非法字符,提示错误码   
  20.   
  21.         n = n*10 + (*str - '0');  
  22.         ++str;  
  23.     }  
  24.   
  25.     return n*flag;  
  26. }  
int charToInt(const char* str)
{
	if (str == NULL) return 0;

	int flag = 1;
	if ( *str == '+' )
	{
		++str;
	} else if (*str == '-')
	{
		flag = -1;
		++str;
	}

	int n = 0;
	while ( *str != '\0' )
	{	
		if ( *str < '0' || *str > '9' )
			return -9999;		//非法字符,提示错误码

		n = n*10 + (*str - '0');
		++str;
	}

	return n*flag;
}

2. 整型转化为字符串

方法一: (自己实现的)

  1. char* IntToChar(int num, char* str)  
  2. {  
  3.     int m = num;  
  4.     int count = 0;  
  5.     if (num < 0)  
  6.     {  
  7.         m = -num;  
  8.         ++count;  //负数,多一个'-'号   
  9.     }  
  10.   
  11.     int n = m;  
  12.   
  13.     while (m != 0)  
  14.     {  
  15.         m = m/10;  
  16.         ++count;  
  17.     }  
  18.   
  19.     *(str+count) = 0;  
  20.     int start = 0;  
  21.     if (num < 0)  
  22.     {  
  23.         *str = '-';  
  24.         start = 1;  
  25.     }  
  26.     while(count > start)  
  27.     {  
  28.         *(str + (--count)) = '0' + n%10;  
  29.         n /= 10;  
  30.     }  
  31.   
  32.     return str;  
  33. }  
char* IntToChar(int num, char* str)
{
	int m = num;
 	int count = 0;
	if (num < 0)
 	{
  		m = -num;
  		++count;  //负数,多一个'-'号
 	}

 	int n = m;

 	while (m != 0)
 	{
  		m = m/10;
  		++count;
 	}

 	*(str+count) = 0;
 	int start = 0;
 	if (num < 0)
 	{
		*str = '-';
		start = 1;
	}
 	while(count > start)
	{
  		*(str + (--count)) = '0' + n%10;
  		n /= 10;
	}

 	return str;
}

方法二:(用snprintf实现,可跨平台)

  1. char* myitoa(int num, char* str)  
  2. {  
  3.     if (str == NULL)  
  4.         return NULL;  
  5.   
  6.     int ret = 0;  
  7.     ret = _snprintf(str, 10, "%d", num);  
  8.     str[ret] = 0;  
  9.   
  10.     return str;  
  11. }  
char* myitoa(int num, char* str)
{
	if (str == NULL)
		return NULL;

	int ret = 0;
	ret = _snprintf(str, 10, "%d", num);
	str[ret] = 0;

	return str;
}

注:windows和linux上snprintf有一点差异


 3. 十进制转化为十六进制

  1. void Dec2Hex(int dec, char* hex)  
  2. {  
  3.     int n = dec;  
  4.     char tmp[16] = {0};  
  5.     int i = 0;  
  6.     for (; n != 0; i++)  
  7.     {  
  8.         int remain = n%16;  
  9.         if (remain < 10)  
  10.         {  
  11.             tmp[i] = '0' + remain;  
  12.         }  
  13.         else  
  14.         {  
  15.             tmp[i] = 'a' + (remain - 10);  
  16.         }  
  17.   
  18.         n = n/16;  
  19.     }  
  20.   
  21.     int k = 0;  
  22.     for (int j = i - 1; j >= 0; j--, k++)  
  23.     {  
  24.         hex[k] = tmp[j];  
  25.     }  
  26.   
  27.     hex[k+1] = 0;  
  28. }  
void Dec2Hex(int dec, char* hex)
{
	int n = dec;
	char tmp[16] = {0};
	int i = 0;
	for (; n != 0; i++)
	{
		int remain = n%16;
		if (remain < 10)
		{
			tmp[i] = '0' + remain;
		}
		else
		{
			tmp[i] = 'a' + (remain - 10);
		}

		n = n/16;
	}

	int k = 0;
	for (int j = i - 1; j >= 0; j--, k++)
	{
		hex[k] = tmp[j];
	}

	hex[k+1] = 0;
}


4. 十六进制转化为十进制

  1. void Hex2Dec(const char* hex, int &dec)  
  2. {  
  3.     dec = 0;  
  4.     int len = strlen(hex);  
  5.     for (int i = 0, j = len - 1; j >= 0; i++,j--)  
  6.     {  
  7.         int value = 0;  
  8.         if (hex[j] >= '0' || hex[j] <= '9')  
  9.         {  
  10.             value = hex[j] - '0';  
  11.         }  
  12.         else if (hex[j] >= 'A' || hex[j] <= 'F')  
  13.         {  
  14.             value = hex[j] - 'A';  
  15.         }  
  16.         else if (hex[j] >= 'a' || hex[j] <= 'f')  
  17.         {  
  18.             value = hex[j] - 'a';  
  19.         }  
  20.   
  21.         dec += value*pow(16.0, i);  
  22.     }  
  23. }  
void Hex2Dec(const char* hex, int &dec)
{
	dec = 0;
	int len = strlen(hex);
	for (int i = 0, j = len - 1; j >= 0; i++,j--)
	{
		int value = 0;
		if (hex[j] >= '0' || hex[j] <= '9')
		{
			value = hex[j] - '0';
		}
		else if (hex[j] >= 'A' || hex[j] <= 'F')
		{
			value = hex[j] - 'A';
		}
		else if (hex[j] >= 'a' || hex[j] <= 'f')
		{
			value = hex[j] - 'a';
		}

		dec += value*pow(16.0, i);
	}
}


5.字符串操作函数

  1. char* strcpy(char* des, const char* src)  
  2. {  
  3.     assert(des != NULL && src != NULL);  
  4.     char* tmp = des;  
  5.     while ( (*tmp++ = *src++) != '\0' ) ;     
  6.     return des;  
  7. }  
  8.   
  9. int strcmp(const char* str1, const char* str2)  
  10. {  
  11.     int ret = 0;  
  12.   
  13.     while( !( ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)  
  14.         ++str1, ++str2;  
  15.   
  16.     if (ret > 0)  
  17.         return 1;  
  18.     else if(ret < 0)  
  19.         return -1;  
  20.   
  21.     return ret;  
  22. }  
  23.   
  24. char* strcat(char* dest, const char* src)  
  25. {  
  26.     if (src == NULL)  
  27.         return dest;  
  28.   
  29.     char* tmp = dest;  
  30.     while( *tmp++ != '\0' )  
  31.         ;  
  32.   
  33.     tmp--;  
  34.   
  35.     while ( (*tmp++ = *src++) != '\0')  
  36.         ;  
  37.   
  38.     return dest;  
  39. }  
  40.   
  41. char* mystrstr(const char* str, const char* strSearch)  
  42. {  
  43.     if (NULL == str || NULL == strSearch)  
  44.         return NULL;  
  45.   
  46.     int findIndex = -1;  
  47.     for (int i = 0; i < strlen(str); i++)  
  48.     {  
  49.         if ( *(str+i) == *strSearch )  
  50.         {  
  51.             int k = i+1;  
  52.             bool bIsStringSame = true;  
  53.             for (int j = 1; j < strlen(strSearch); j++, k++)  
  54.             {  
  55.                 if ( *(str+k) != *(strSearch+j) )  
  56.                 {  
  57.                     bIsStringSame = false;  
  58.                     break;  
  59.                 }  
  60.             }  
  61.               
  62.             if (bIsStringSame)  
  63.             {  
  64.                 findIndex = i;  
  65.                 break;  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     if (findIndex == -1)  
  71.     {  
  72.         return NULL;  
  73.     }  
  74.     else  
  75.     {  
  76.         return const_cast<char*>(&str[findIndex]);  
  77.     }  
  78.   
  79.   
  80. }  
  81.   
  82. bool strsubstr(char *s, char *sub)  /* 字符串子串查找,如果子串sub在s中存在,则返回1,否则返回0 */  
  83. {  
  84.     bool result = 0;  
  85.   
  86.     /* 代码在这里实现 */  
  87.     if ( s == NULL || sub == NULL)  
  88.         return result;  
  89.   
  90.     char start = *sub;  
  91.     while (*s != '\0')  
  92.     {  
  93.         if (*s == start)  
  94.         {  
  95.             s++;  
  96.             sub++;  
  97.             while ( *sub != '\0' && *s != '\0' && *s == *sub )   
  98.             {  
  99.                 s++;  
  100.                 sub++;  
  101.             }  
  102.   
  103.             if (*sub == '\0')  
  104.             {  
  105.                 result = 1;  
  106.                 break;  
  107.             }  
  108.         }  
  109.   
  110.         s++;  
  111.     }  
  112.   
  113.     return result;  
  114. }  
char* strcpy(char* des, const char* src)
{
	assert(des != NULL && src != NULL);
	char* tmp = des;
	while ( (*tmp++ = *src++) != '\0' ) ;	
	return des;
}

int strcmp(const char* str1, const char* str2)
{
	int ret = 0;

	while( !( ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)
		++str1, ++str2;

	if (ret > 0)
		return 1;
	else if(ret < 0)
		return -1;

	return ret;
}

char* strcat(char* dest, const char* src)
{
	if (src == NULL)
		return dest;

	char* tmp = dest;
	while( *tmp++ != '\0' )
		;

	tmp--;

	while ( (*tmp++ = *src++) != '\0')
		;

	return dest;
}

char* mystrstr(const char* str, const char* strSearch)
{
	if (NULL == str || NULL == strSearch)
		return NULL;

	int findIndex = -1;
	for (int i = 0; i < strlen(str); i++)
	{
		if ( *(str+i) == *strSearch )
		{
			int k = i+1;
			bool bIsStringSame = true;
			for (int j = 1; j < strlen(strSearch); j++, k++)
			{
				if ( *(str+k) != *(strSearch+j) )
				{
					bIsStringSame = false;
					break;
				}
			}
			
			if (bIsStringSame)
			{
				findIndex = i;
				break;
			}
		}
	}

	if (findIndex == -1)
	{
		return NULL;
	}
	else
	{
		return const_cast<char*>(&str[findIndex]);
	}


}

bool strsubstr(char *s, char *sub)  /* 字符串子串查找,如果子串sub在s中存在,则返回1,否则返回0 */
{
	bool result = 0;

	/* 代码在这里实现 */
	if ( s == NULL || sub == NULL)
		return result;

	char start = *sub;
	while (*s != '\0')
	{
		if (*s == start)
		{
			s++;
			sub++;
			while ( *sub != '\0' && *s != '\0' && *s == *sub ) 
			{
				s++;
				sub++;
			}

			if (*sub == '\0')
			{
				result = 1;
				break;
			}
		}

		s++;
	}

	return result;
}


6.求1~100以内素数 (简单算法)

  1.  bool IsPrimeNumber(int n)  
  2. {  
  3.     if(n < 2) return false;  
  4.   
  5.     int i = 2;  
  6.     for ( ;i < sqrt((float)n); i++)  
  7.     {  
  8.         if (n%i == 0)  
  9.             break;  
  10.     }  
  11.   
  12.     if (i > sqrt((float)n))  
  13.         return true;  
  14.   
  15.     return false;  
  16. }  
 bool IsPrimeNumber(int n)
{
	if(n < 2) return false;

	int i = 2;
	for ( ;i < sqrt((float)n); i++)
	{
		if (n%i == 0)
			break;
	}

	if (i > sqrt((float)n))
		return true;

	return false;
}
  1. for (int i = 1; i <= 100; i += 2)  
  2. {  
  3.     if (IsPrimeNumber(i)) printf("%d ", i);  
  4. }  
for (int i = 1; i <= 100; i += 2)
{
	if (IsPrimeNumber(i)) printf("%d ", i);
}


7.求两个数的最大公约数

辗转相除法:循环相除,用较大数除以较小数,余数如果不为0,则余数作为下一次的除数,除数作为下一次的被除数,直到余数为0。那么最后一次预算的除数就是最大公约数。

  1. int GetMaxCommonDivisor(int a, int b)  
  2. {  
  3.     //先找出较大数和较小数   
  4.     int bigger = a > b ? a:b;          
  5.     int smaller = a < b ? a:b;  
  6.     a = bigger;  
  7.     b = smaller;  
  8.   
  9.     int tmp = 0;  
  10.     while (b != 0)  
  11.     {  
  12.         tmp = b;  
  13.         b = a%b;  
  14.         a = tmp;  
  15.     }  
  16.   
  17.     return tmp;  
  18. }  
int GetMaxCommonDivisor(int a, int b)
{
	//先找出较大数和较小数
	int bigger = a > b ? a:b;		
	int smaller = a < b ? a:b;
	a = bigger;
	b = smaller;

	int tmp = 0;
	while (b != 0)
	{
		tmp = b;
		b = a%b;
		a = tmp;
	}

	return tmp;
}

递归求法:

  1. int GetMaxDivisor(int a, int b)  
  2. {  
  3.     int bigger = a > b ? a:b;          
  4.     int smaller = a < b ? a:b;  
  5.   
  6.     if (bigger%smaller == 0)  
  7.         return smaller;  
  8.     else  
  9.         return GetMaxDivisor(smaller, bigger%smaller);  
  10. }  
int GetMaxDivisor(int a, int b)
{
	int bigger = a > b ? a:b;		
	int smaller = a < b ? a:b;

	if (bigger%smaller == 0)
		return smaller;
	else
		return GetMaxDivisor(smaller, bigger%smaller);
}

 


8.求两个数的最小公倍数

求法:先求这两个数的最大公约数,最小公倍数 = 两数的乘积 / 最大公约数

  1. int GetMinMultiple(int a, int b)  
  2. {  
  3.     int maxDivisor = GetMaxCommonDivisor(a,b);  
  4.   
  5.     return a*b/maxDivisor;  
  6. }  
int GetMinMultiple(int a, int b)
{
	int maxDivisor = GetMaxCommonDivisor(a,b);

	return a*b/maxDivisor;
}

 


9.二叉树的遍历与深度

二叉树的遍历

  1. struct BTNode  
  2. {  
  3.     int         data;  
  4.     BTNode      *lchild;  
  5.     BTNode      *rchild;  
  6. };  
  7.   
  8. //前序遍历   
  9. void Before_Traversal(BTNode* root)  
  10. {  
  11.     if (root == NULL)  
  12.         return ;  
  13.   
  14.     printf("%d ", root->data);  
  15.     Before_Traversal(root->lchild);  
  16.     Before_Traversal(root->rchild);  
  17. }  
  18.   
  19. //中序遍历   
  20. void Middle_Traversal(BTNode* root)  
  21. {  
  22.     if (root == NULL)  
  23.         return ;  
  24.   
  25.     Middle_Traversal(root->lchild);  
  26.     printf("%d ", root->data);  
  27.     Middle_Traversal(root->rchild);  
  28. }  
  29.   
  30. //后序遍历   
  31. void After_traversal(BTNode* root)  
  32. {  
  33.     if (root == NULL)  
  34.         return ;  
  35.   
  36.     After_traversal(root->lchild);  
  37.     After_traversal(root->rchild);  
  38.     printf("%d ", root->data);  
  39. }  
struct BTNode
{
	int			data;
	BTNode		*lchild;
	BTNode		*rchild;
};

//前序遍历
void Before_Traversal(BTNode* root)
{
	if (root == NULL)
		return ;

	printf("%d ", root->data);
	Before_Traversal(root->lchild);
	Before_Traversal(root->rchild);
}

//中序遍历
void Middle_Traversal(BTNode* root)
{
	if (root == NULL)
		return ;

	Middle_Traversal(root->lchild);
	printf("%d ", root->data);
	Middle_Traversal(root->rchild);
}

//后序遍历
void After_traversal(BTNode* root)
{
	if (root == NULL)
		return ;

	After_traversal(root->lchild);
	After_traversal(root->rchild);
	printf("%d ", root->data);
}

求二叉树的深度

  1. int GetBTreeDeep(BTNode* root)  
  2. {  
  3.     if (root == NULL)  
  4.         return 0;  
  5.   
  6.     int a = GetBTreeDeep(root->lchild);  
  7.     int b = GetBTreeDeep(root->rchild);  
  8.   
  9.     return (a>b)?(a+1):(b+1);  
  10. }  
int GetBTreeDeep(BTNode* root)
{
	if (root == NULL)
		return 0;

	int a = GetBTreeDeep(root->lchild);
	int b = GetBTreeDeep(root->rchild);

	return (a>b)?(a+1):(b+1);
}

 

10. 将两个顺序排列的数组a,b合并为一个数组,合并后依然有序

  1. void MyLinkFunc(int* a,int n,int* b,int m,int* c)   //n,m为数组a,b的长度   
  2. {  
  3.     int i = 0;  
  4.     int j = 0;  
  5.   
  6.     for (; i < n && j < m ;)  
  7.     {  
  8.         *c++ = (a[i] < b[j]) ? a[i++] : b[j++];  
  9.     }  
  10.   
  11.     while (i < n)  
  12.     {  
  13.         *c++ = a[i++];  
  14.     }  
  15.   
  16.     while (j < m)  
  17.     {  
  18.         *c++ = b[j++];  
  19.     }  
  20. }  
void MyLinkFunc(int* a,int n,int* b,int m,int* c)	//n,m为数组a,b的长度
{
	int i = 0;
	int j = 0;

	for (; i < n && j < m ;)
	{
		*c++ = (a[i] < b[j]) ? a[i++] : b[j++];
	}

	while (i < n)
	{
		*c++ = a[i++];
	}

	while (j < m)
	{
		*c++ = b[j++];
	}
}


类似的算法:两个有序链表a,b。将他们俩合并为一个链表,合并之后链表还是有序的

  1. struct Node  
  2. {  
  3.     int data;  
  4.     Node*   next;  
  5. };  
struct Node
{
	int	data;
	Node*	next;
};
  1. Node* Merge2OneSeqList(Node* list1, Node* list2)  
  2. {  
  3.     if (list1 == NULL) return list2;  
  4.     if (list2 == NULL) return list1;  
  5.   
  6.     Node* head = NULL;  
  7.     Node* p1 = list1;  
  8.     Node* p2 = list2;  
  9.   
  10.     if (p1->data < p2->data)  
  11.     {  
  12.         head = list1;  
  13.         p1 = p1->next;  
  14.         p2 = p2;  
  15.     }  
  16.     else  
  17.     {  
  18.         head = list2;  
  19.         p1 = p1;  
  20.         p2 = p2->next;  
  21.     }  
  22.   
  23.     Node* pCur = head;  
  24.     while (p1 != NULL && p2 != NULL)  
  25.     {  
  26.         if (p1->data < p2->data)  
  27.         {  
  28.             pCur->next = p1;  
  29.             pCur = p1;  
  30.             p1 = p1->next;  
  31.         }  
  32.         else  
  33.         {  
  34.             pCur->next = p2;  
  35.             pCur = p2;  
  36.             p2 = p2->next;  
  37.         }  
  38.     }  
  39.   
  40.     if ( p1 != NULL )  
  41.         pCur->next = p1;  
  42.     if ( p2 != NULL )  
  43.         pCur->next = p2;  
  44.   
  45.     return head;  
  46. }  
Node* Merge2OneSeqList(Node* list1, Node* list2)
{
	if (list1 == NULL) return list2;
	if (list2 == NULL) return list1;

	Node* head = NULL;
	Node* p1 = list1;
	Node* p2 = list2;

	if (p1->data < p2->data)
	{
		head = list1;
		p1 = p1->next;
		p2 = p2;
	}
	else
	{
		head = list2;
		p1 = p1;
		p2 = p2->next;
	}

	Node* pCur = head;
	while (p1 != NULL && p2 != NULL)
	{
		if (p1->data < p2->data)
		{
			pCur->next = p1;
			pCur = p1;
			p1 = p1->next;
		}
		else
		{
			pCur->next = p2;
			pCur = p2;
			p2 = p2->next;
		}
	}

	if ( p1 != NULL )
		pCur->next = p1;
	if ( p2 != NULL )
		pCur->next = p2;

	return head;
}

另一种解法:(递归)

  1. Node* Merge2OneSeqList(Node* list1, Node* list2)  
  2. {  
  3.     if (list1 == NULL) return list2;  
  4.     if (list2 == NULL) return list1;  
  5.   
  6.     Node* head = NULL;  
  7.     if (list1->data < list2->data)  
  8.     {  
  9.         head = list1;  
  10.         head->next = Merge2OneSeqList(list1->next, list2);  
  11.     }  
  12.     else  
  13.     {  
  14.         head = list2;  
  15.         head->next = Merge2OneSeqList(list1, list2->next);  
  16.     }  
  17.   
  18.     return head;  
  19. }  
Node* Merge2OneSeqList(Node* list1, Node* list2)
{
	if (list1 == NULL) return list2;
	if (list2 == NULL) return list1;

	Node* head = NULL;
	if (list1->data < list2->data)
	{
		head = list1;
		head->next = Merge2OneSeqList(list1->next, list2);
	}
	else
	{
		head = list2;
		head->next = Merge2OneSeqList(list1, list2->next);
	}

	return head;
}

10. 将两个顺序排列的数组a,b合并为一个数组,合并后依然有序

  1. //冒泡排序   
  2. void BubbleSort(int arr[], int n)  
  3. {  
  4.     int tmp;  
  5.     for (int i = 0; i < n - 1; i++)  
  6.     {  
  7.         for (int j = i + 1; j < n; j++)  
  8.         {  
  9.             if (arr[j] < arr[j-1])  
  10.             {  
  11.                 tmp     = arr[j];  
  12.                 arr[j]  = arr[j-1];  
  13.                 arr[j-1]= tmp;  
  14.             }  
  15.         }  
  16.     }  
  17. }  
//冒泡排序
void BubbleSort(int arr[], int n)
{
	int tmp;
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			if (arr[j] < arr[j-1])
			{
				tmp		= arr[j];
				arr[j]	= arr[j-1];
				arr[j-1]= tmp;
			}
		}
	}
}


 

  1. //快速排序   
  2. int Partition(int arr[], int low, int high);  
  3. void QuickSort(int arr[], int low, int high)  
  4. {  
  5.     int temp;  
  6.     if (low < high)  
  7.     {  
  8.         temp = Partition(arr, low, high);  
  9.         QuickSort(arr, low, temp-1);  
  10.         QuickSort(arr, temp+1, high);  
  11.     }  
  12. }  
  13.   
  14.   
  15. int Partition( int arr[], int low, int high )  
  16. {  
  17.     int pivot = arr[low];  
  18.     int temp;  
  19.   
  20.     while (low < high)  
  21.     {  
  22.         while(low < high && arr[high] > pivot)  
  23.         {  
  24.             --high;  
  25.         }  
  26.         temp = arr[high];  
  27.         arr[high] = arr[low];  
  28.         arr[low] = temp;  
  29.   
  30.         while(low < high && arr[low] < pivot)  
  31.         {  
  32.             ++low;  
  33.         }  
  34.         temp = arr[high];  
  35.         arr[high] = arr[low];  
  36.         arr[low] = temp;  
  37.     }  
  38.   
  39.     return low;  
  40. }  
//快速排序
int Partition(int arr[], int low, int high);
void QuickSort(int arr[], int low, int high)
{
	int temp;
	if (low < high)
	{
		temp = Partition(arr, low, high);
		QuickSort(arr, low, temp-1);
		QuickSort(arr, temp+1, high);
	}
}


int Partition( int arr[], int low, int high )
{
	int pivot = arr[low];
	int temp;

	while (low < high)
	{
		while(low < high && arr[high] > pivot)
		{
			--high;
		}
		temp = arr[high];
		arr[high] = arr[low];
		arr[low] = temp;

		while(low < high && arr[low] < pivot)
		{
			++low;
		}
		temp = arr[high];
		arr[high] = arr[low];
		arr[low] = temp;
	}

	return low;
}

11.一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次,怎么计算

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     int nSecPos = 0;  
  4.     int nMinPos = 0;  
  5.     int nHourPos = 0;  
  6.   
  7.     int count = 0;  
  8.   
  9.     int nSec = 0;  
  10.     int nMin = 0;  
  11.     int nHour = 0;  
  12.   
  13.     for (int i = 1; i <= SECONDS_ONE_DAY; i++ )  
  14.     {  
  15.         nSecPos = i%60;  
  16.         nMinPos  = i/60;  
  17.   
  18.         //先求hour   
  19.         nHourPos = nMinPos/12;  
  20.         if (nHourPos >= 60)  
  21.         {  
  22.             nHourPos = nHourPos%60;  
  23.         }  
  24.   
  25.         if (nMinPos >= 60)  
  26.         {  
  27.             nMinPos = nMinPos%60;  
  28.         }  
  29.   
  30.   
  31.         if (nSecPos == nMinPos && nMinPos == nHourPos)  
  32.         {  
  33.             nSec = i%60;  
  34.             nMin = (i/60)%60;  
  35.             nHour = (i/60)/60;  
  36.             printf("%d:%d:%d--%d--Hour=%d,Min=%d,Sec=%d\n",nHour,nMin,nSec, i, nHourPos, nMinPos, nSecPos);  
  37.             count++;  
  38.         }  
  39.     }  
  40.   
  41.     printf("count=%d\n", count);    //总共有多少次   
  42.   
  43.     return 0;  
  44. }  
int _tmain(int argc, _TCHAR* argv[])
{
	int nSecPos = 0;
	int nMinPos = 0;
	int nHourPos = 0;

	int count = 0;

	int nSec = 0;
	int nMin = 0;
	int nHour = 0;

	for (int i = 1; i <= SECONDS_ONE_DAY; i++ )
	{
		nSecPos = i%60;
		nMinPos  = i/60;

		//先求hour
		nHourPos = nMinPos/12;
		if (nHourPos >= 60)
		{
			nHourPos = nHourPos%60;
		}

		if (nMinPos >= 60)
		{
			nMinPos = nMinPos%60;
		}


		if (nSecPos == nMinPos && nMinPos == nHourPos)
		{
			nSec = i%60;
			nMin = (i/60)%60;
			nHour = (i/60)/60;
			printf("%d:%d:%d--%d--Hour=%d,Min=%d,Sec=%d\n",nHour,nMin,nSec, i, nHourPos, nMinPos, nSecPos);
			count++;
		}
	}

	printf("count=%d\n", count);	//总共有多少次

	return 0;
}

11. 约瑟夫问题

(1).利用数组解法

  1. //输入:           num 表示数组元素个数   
  2. //      start   表示报数起始位置   
  3. //      dis    表示报数间隔数     
  4. void Josephus(int A[], int num, int start, int dis)  
  5. {  
  6.     if (dis == 0)  
  7.     {  
  8.         printf("dis==0 is invalid.\n");  
  9.         return;  
  10.     }  
  11.   
  12.     int i,j,k;  
  13.     int tmp = 0;  
  14.     //初始化数组   
  15.     for (i = 0; i < num; i++)  
  16.     {  
  17.         A[i] = i+1;  
  18.     }  
  19.   
  20.     i = start-1;        //报数起始下标   
  21.   
  22.     for (k = num; k > 1; k--)  
  23.     {  
  24.         if (i==k) i = 0;            //如果报数下标还留在尾部+1位置,则回到数组0位置   
  25.         i = (i + dis - 1)%k;        //寻找出句位置   
  26.         if (i != k - 1)             //如果出局数不在末尾,则把其移动到最后,其他元素向前移动一位。如果在末尾则不用动。   
  27.         {  
  28.             tmp = A[i];  
  29.             for ( j = i; j < k - 1; j++) A[j] = A[j+1];  
  30.             A[j] = tmp;  
  31.         }  
  32.     }  
  33.   
  34.     for (k = 0; k < num/2; k++)  
  35.     {  
  36.         tmp = A[k];  
  37.         A[k] = A[num-k-1];  
  38.         A[num-k-1] = tmp;  
  39.     }  
  40.   
  41. }  
//输入:	        num	表示数组元素个数
//		start	表示报数起始位置
//		dis    表示报数间隔数	
void Josephus(int A[], int num, int start, int dis)
{
	if (dis == 0)
	{
		printf("dis==0 is invalid.\n");
		return;
	}

	int i,j,k;
	int tmp = 0;
	//初始化数组
	for (i = 0; i < num; i++)
	{
		A[i] = i+1;
	}

	i = start-1;		//报数起始下标

	for (k = num; k > 1; k--)
	{
		if (i==k) i = 0;			//如果报数下标还留在尾部+1位置,则回到数组0位置
		i = (i + dis - 1)%k;		//寻找出句位置
		if (i != k - 1)				//如果出局数不在末尾,则把其移动到最后,其他元素向前移动一位。如果在末尾则不用动。
		{
			tmp = A[i];
			for ( j = i; j < k - 1; j++) A[j] = A[j+1];
			A[j] = tmp;
		}
	}

	for (k = 0; k < num/2; k++)
	{
		tmp = A[k];
		A[k] = A[num-k-1];
		A[num-k-1] = tmp;
	}

}

(2).利用循环链表解法

  1. typedef struct Node  
  2. {  
  3.        int data;  
  4.        struct Node *next;  
  5. } Node;  
  6.    
  7. /** 
  8.  * @功能约瑟夫环 
  9.  * @参数 total:总人数 
  10.  * @参数 from: 第一个报数的人 
  11.  * @参数 count:出列者喊到的数 
  12.  */  
  13. void JOSEPHUS(int total, int from, int count)  
  14. {  
  15.     // pcur为当前结点,pre为辅助结点,指向pcur的前驱结点,head为头节点   
  16.     Node *pcur, *pre, *head;  
  17.     head = NULL;  
  18.     int i;  
  19.      
  20.     // 建立循环链表   
  21.     for(i = 1; i <= total; i++)  
  22.     {  
  23.         pcur = (Node *)malloc(sizeof(Node));  
  24.         pcur->data = i;  
  25.         if(NULL ==head)  
  26.          {  
  27.            head = pcur;  
  28.          }  
  29.         else  
  30.          {  
  31.             pre->next = pcur;  
  32.          }  
  33.          pre = pcur;  
  34.     }  
  35.     pcur->next = head;      // 尾节点连到头结点,使整个链表循环起来   
  36.     pcur = head;            // 使pcur指向头节点   
  37.      
  38.     // 把当前指针移动到第一个报数的人,即第k位的下一位   
  39.     for(i = 1; i < from; i++)  
  40.     {  
  41.         pre = pcur;  
  42.         pcur = pcur->next;  
  43.     }  
  44.      
  45.     // 循环地删除队列结点,每隔m-1个结点删一个   
  46.     while(pcur->next != pcur)  
  47.     {  
  48.         for(i = 1; i < count; i++)  
  49.         {  
  50.             pre = pcur;  
  51.             pcur = pcur->next;  
  52.         }  
  53.         pre->next = pcur->next;  
  54.         printf("delete number: %d\n", pcur->data);  
  55.         free(pcur);  
  56.         pcur = pre->next;  
  57.     }  
  58.      
  59.     printf("The last number: %d\n", pcur->data);  
  60. }  
typedef struct Node
{
       int data;
       struct Node *next;
} Node;
 
/**
 * @功能约瑟夫环
 * @参数 total:总人数
 * @参数 from: 第一个报数的人
 * @参数 count:出列者喊到的数
 */
void JOSEPHUS(int total, int from, int count)
{
    // pcur为当前结点,pre为辅助结点,指向pcur的前驱结点,head为头节点
    Node *pcur, *pre, *head;
    head = NULL;
    int i;
   
    // 建立循环链表
    for(i = 1; i <= total; i++)
    {
        pcur = (Node *)malloc(sizeof(Node));
        pcur->data = i;
        if(NULL ==head)
         {
           head = pcur;
         }
        else
         {
            pre->next = pcur;
         }
         pre = pcur;
    }
    pcur->next = head;      // 尾节点连到头结点,使整个链表循环起来
    pcur = head;            // 使pcur指向头节点
   
    // 把当前指针移动到第一个报数的人,即第k位的下一位
    for(i = 1; i < from; i++)
    {
        pre = pcur;
        pcur = pcur->next;
    }
   
    // 循环地删除队列结点,每隔m-1个结点删一个
    while(pcur->next != pcur)
    {
        for(i = 1; i < count; i++)
        {
            pre = pcur;
            pcur = pcur->next;
        }
        pre->next = pcur->next;
        printf("delete number: %d\n", pcur->data);
        free(pcur);
        pcur = pre->next;
    }
   
	printf("The last number: %d\n", pcur->data);
}

(3).利用数学公式解法

设f(m,k,i)为m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果

当i=1时,  f(m,k,i) = (m+k-1)%m(这里减1是因为从0开始计数)

当i!=1时,  f(m,k,i)= ( f(m-1,k,i-1)+k )%m

  1. int fun(int m,int k,int i)  
  2. {  
  3.        if(1 == i)  
  4.        {  
  5.          return (m + k - 1) % m;  
  6.        }  
  7.        else  
  8.        {  
  9.          return (fun(m - 1, k, i - 1) + k) % m;  
  10.        }  
  11. }  
  12.    
  13. int main(int argc, char* argv[])  
  14. {  
  15.        for(int i = 1; i <= 13; i++)  
  16.        {  
  17.          printf("第%d次出环:%d\n", i, fun(13, 3, i));  
  18.        }  
  19.        return 0;  
  20. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板中拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器中打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符中运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值