C语言编程题

程序代码

1、递归

求阶乘n!

int function1(int n)
{
	if (n == 0)
		return 1;
	while (n >= 1)
	{
		return n*function1(n - 1);
	}
}

int function2(int n)
{
	if (n == 0)
		return 1;
	else
		return n*function2(n - 1);
}

2、输入一个整数(任意位数),倒叙输出:

//计算位数
int length_num(int n)
{
	int num_temp = n;
	int flag = 0;
	while (num_temp > 0)
	{ 
		num_temp /= 10;
		flag++;
	}
	return flag;
}
//输入一个整数(任意位数),倒叙输出:
int fun3(int n)
{
	int flag = length_num(n);
	int *p = (int *)malloc(flag * sizeof(int));
	for (int i = 0; i < flag; i++)
	{
		int temp = n % 10;
		*(p + i) = temp;
		n = n / 10;
	}//例如n=123,存储为321
	int n1 = 0;
	for (int i = 0; i < flag; i++)
	{
		n1 = 10 * n1 + (*(p + i));
	}
	free(p);
	return n1;
}

3、将一个数组逆序放到原来数组中。(考虑复杂度)

void fun4(int *p, int length)
{
	int n = length / 2;
	for(int i=0;i<n;i++)
	{
		int temp = *(p + i);
		*(p + i) = *(p + length - 1 - i);
		*(p + length - 1 - i) = temp;
	}
}

4、斐波那契数列:

Fib(0) = 0 
Fib(1) = 1 
Fib(n) = Fib(n-1) + Fib(n-2)

F() = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 …

//斐波那契,使用递归算法复杂度为 O(2n)。
int fun5(int n)
{
	if (n == 0)
		return 0;
	if (n == 1)
		return 1;
	if (n > 1)
		return fun5(n - 1) + fun5(n - 2);
}
//斐波那契,不用递归,算法复杂度O(n)
int fun6(int n)
{
	if (n <= 1)
		return n;
	else
	{
		int forward1 = 0, forward2 = 1;
		int now = 0;
		for (int i = 1; i < n; i++)
		{
			now = forward1 + forward2;
			forward1 = forward2;
			forward2 = now;
		}
		return now;
	}
}

5、排序

5.1冒泡排序

//冒泡排序,顺序 小---大,比较相邻数,每次循环后,最后的数总是最大
void sort1(int *a, int N)
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N-1 - i; j++)
		{
			
			if (a[j + 1] < a[j])
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}//j
	}//i
}

5.2、选择排序

//选择排序,每次选出i-N中最小值
void sort2(int *a, int N)
{

	for (int i = 0; i < N; i++)
	{
		int min_flag = i;
		for (int j = i; j < N; j++)
		{
			if (a[min_flag] > a[j])
			{
				min_flag = j;
			}

		}
		int temp = a[i];
		a[i] = a[min_flag];
		a[min_flag] = temp;
	}
}

6、字符串循环移动

编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” 函数头是这样的:

//pStr是指向以’\0’结尾的字符串的指针
//steps是要求移动的n
void LoopMove ( char * pStr, int steps )
{
//请填充…
}

方法1:

//移动字符串循环1
void str_loop(char *p,int N,int loop_n)
{
	//求数组长度,包括\0
	int length = 0;
	for (int i = 0; i < N; i++)
	{
		length++;
		if (p[i] == '\0')
			break;
	}
	char * temp;
	temp = (char*)malloc(length * sizeof(char));
//求loop后的temp
	loop_n = loop_n % (length - 1);
	int j = 0;
	for (int i =length-loop_n ; i < length - 1; i++)
	{
		temp[j] = p[i];
		j++;
	}
	for (int i = 0; i < length - loop_n; i++)//temp前半段赋值
	{
		temp[j] = p[i];
		j++;
	}	
	temp[j] = '\0';	
	for (int i = 0; i < length; i++)//temp后半段赋值
	{
		p[i] = temp[i];
	}
	free(temp);
}

方法2:使用字符串函数

//移动字符串循环2
void str_loop2(char *p, int loop_N)
{
	int length = strlen(p);//不含\0
	char *temp;
	temp = (char*)malloc(2*(length + 1) * sizeof(char));//保证temp内存大于p
	loop_N = loop_N%length;
	strcpy_s(temp,length+1, p+ length- loop_N);
	strcpy_s(temp + loop_N, length + 1, p);
	temp[length] = '\0';
	strcpy_s(p, length + 1, temp);
	free(temp);
}

7、计算字符串最后一个单词长度

//计算字符串中最后一个单词长度,空格为分割(字符串末尾可能有空格)
int last_world_length(char *p)
{
	int length = strlen(p);
	int count = 0;
	int t = length - 1;
	//排除第一个空格,如果有
	if (p[length - 1] = ' ')
	{
		t--;
	}
	while (p[t]!=' ')
	{
		t--;
		count++;
	}
	return count;
}

8、删除一个字符串中指定的所有某个字符。

联发科2017笔试题
//删除字符串中某个字符
void delete_ch(char * str, char c)
{
	char * temp;
	int length = strlen(str);
	temp = (char *)malloc((length + 1) * sizeof(char));
	int j = 0;
	for (int i = 0; i < length; i++)
	{
		if (str[i] != c)
		{
			temp[j] = str[i];
			j++;
		}
	}//i
	temp[j] = '\0';
	printf("%s\n", temp);
	strcpy_s(str, length, temp);
}

9、用一个表达式判断一个整数是否在某两个整数之间

//用一个表达式判断一个数b是否在两个数a,c之间
int between(unsigned int a, unsigned b, unsigned c)
{
	return c - a > c - b;
}
10、







猜你喜欢

转载自blog.csdn.net/weixin_37058227/article/details/80741836