西安电子科技大学2023级C语言期末题库(xdoj试题)

题库共计36道题,会从中选取两道作为期末原题。

笔者为加强自身理解,同时也为同学们提供一点思路写这篇博客。 

(这是笔者第一次写博客,如有不当之处敬请谅解并不吝指正)

难度划分:

1   难度较低,通过简单语句即可实现

2  考查了一些易错知识点或者有一定的巧法

3   有一些易被忽略的特殊情况,对数学逻辑有一定的考察

4  通过巧法可以快速解决,但不易想出,常规方法比较麻烦,可以记一下大致思路

5  考场上很难快速完成,可能会影响心态,建议直接背

 

671.方差计算(1)

e3b44ffa59464a65962fd457b20f8102.png

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[50] = { 0 };
	int i = 0;
//当输入多个数据时往往采用数组来存储
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
//输入部分
	int ave = 0;//平均数
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += arr[i];
	}
	ave = sum / n;
	int sp = 0;
	for (i = 0; i < n; i++)
	{
		sp = sp + (arr[i] - ave) * (arr[i] - ave);
	}
	int p = sp / n;
	printf("%d\n", p);
	return 0;
}

 

672.计算正弦函数(1)

9f54d83dba0642a2a9f15a6bf463b5eb.png

#include <stdio.h>
#include <math.h>
int fac(int x)//求阶乘函数,运用了函数的递归
{
	if (x > 0)
		return x * fac(x - 1);
	else
		return 1;
}

int main()
{
	int n = 0;
	double x = 0.0;
	scanf("%d %lf", &n, &x);
	double ret = 0.0000;
	int i = 0;
	int s = 1;//变号符,常用于正负号交替出现的求和
	for (i = 1; i <= n; i++)
	{
		ret = ret + pow(x, 2*i-1) / fac(2*i-1)*s;
//注意:数学函数(如pow,sqrt等)在使用时要引用头文件,且传参类型为double
		s = -s;//实现正负号交替
	}
	printf("%.4lf", ret);
	return 0;
}

673.判断同构数(4)

b472ead388d641f4a9288aa0bb67e9f5.png

#include <stdio.h>
#include <math.h>
int get_num(int n)//该函数用于求传入参数的位数
{
	int count = 0;
	while (n > 0)
	{
		count++;
		n /= 10;
	}
	return count;
}
int my_pow(int x, int n)
//求幂函数,可用库函数中的pow代替,但在整数求幂时。笔者倾向于自己写一个使用
{
	if (n > 0)
		return x * my_pow(x, n - 1);
	else
		return 1;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int num = n * n;//求出输入n的平方数
	int m = get_num(n);//求出n的位数
//关键步骤
	int ret = num % my_pow(10, m) - n;
//通过num%my_pow(10,m)求出num的尾部m位,然后与n比较
//具体原理见下图
	if (ret == 0)
		printf("%d 1", n);
	else
		printf("%d 0", n);
	return 0;

9567956b8348445db8bfb540279f5154.png

674.信号解调(2)

6d2b72a7b0574280a4f623129afe668f.png

#include <stdio.h>
int dis(int x, int y)//求距离函数,也可直接在main函数中求,笔者用函数纯属个人习惯
{
	int s1 = (x - 4) * (x - 4) + (y - 4) * (y - 4);
	int s2 = (x + 4) * (x + 4) + (y + 4) * (y + 4);
	if (s1 < s2)
		return 1;
	else
		return 2;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[20][2] = { 0 };
//使用二维数组存储是因为后续计算是以两个数据为一组进行的,即(x,y),故使用arr[20][2],这样处理起数据更方便
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < 2; j++)
		{
			scanf(" %d", &arr[i][j]);
		}
	}//输入数据
	for (i = 0; i < n; i++)
	{
		printf("%d ", dis(arr[i][0],arr[i][1]));
	}
	return 0;
}

675.可构造三角形的数量(2)

a06bc9aa791b453a87de3bdac2df3eea.png

#include <stdio.h>
int is_max(int a, int b, int c)
{
	int d = a > b ? a : b;
	return c > d ? c : d;
}
int is_min(int a, int b, int c)
{
	int d = a <  b ? a : b;
	return c <  d ? c : d;
}
int is_mid(int a, int b, int c)
{
	int max = is_max(a, b, c);
	int min = is_min(a, b, c);
	if (a > min && a < max)
	{
		return a;
	}
	if (b > min && b < max)
	{
		return b;
	}
	if (c > min && c < max)
	{
		return c;
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[30] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int flag = 0;
	int min = 0;
	int max = 0;
	int mid = 0;
	for (i = 0; i < n - 2; i++)
	{
		min = is_min(arr[i], arr[i + 1], arr[i + 2]);
		max = is_max(arr[i], arr[i + 1], arr[i + 2]);
		mid = is_mid(arr[i], arr[i + 1], arr[i + 2]);
		if (min+mid> max)//判断三角形常用两边和大于第三边或两边差小于第三边
//但需注意,在三边长未知时要分别比较,笔者这里直接找出了长边,短边,所以只比较了一次
			flag++;
	}
	printf("%d", flag);
	return 0;
}

676.ROT13解密(3)

b5ff2eddc7c540a0adc4ce8464d73f2c.png

#include <stdio.h>
int main()
{
	char str[60] = "0";
	gets(str);//输入字符串时最好用gets函数,因为scanf函数无法读取空格
	int i = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		if (str[i]<='M'&&str[i]>='A')
			str[i] += 13;
		else if (str[i] <= 'Z' && str[i] >= 'N')
			str[i] -= 13;
		else if (str[i] <= 'm' && str[i] >= 'a')
			str[i] += 13;
		else if (str[i] <= 'z' && str[i] >= 'n')		
			str[i] -= 13;
//这里主要需要注意:有些字母只能加13替换,有些只能减13替换,结合ASCII码表(下附)更易于理解
	}
	printf("%s", str);
	return 0;
}

 3cdbd6c101574ceda6efcc409abc4fcb.png

677.勒让德多项式(2)

d8aa6768f94d45b29546abd6e88fa7e9.png

double get_Pn(int n, double x)//该函数是求勒让德多项式的第n项
{
	if (n > 1)
		return (get_Pn(n - 1, x) * x * (2 * n - 1) - get_Pn(n - 2, x) * (n - 1)) / (n);
	else if (n == 1)
		return x;
	else if (n == 0)
		return 1;
}
int main()
{
	int n = 0;
	double x = 0.0000;
	scanf("%d %lf", &n, &x);
	double sum = 0.0000;
	int i = 0;
	for (i = 1; i <= n; i++)
	{
		sum += get_Pn(i, x);
	}
	printf("%.4lf", sum);
	return 0;
}

 

680.函数的最大值(1)41a57c2936974ab1967c1274eb7b4151.png

#include <stdio.h>

int main()
{
	double a = 0.0;
//该题样例可能使用的是double类型,所以推荐最好使用double(精度相对更高)
	scanf("%lf", &a);
	double i = 0.00;
	double max = 0.00;
	double y = 0.00;
	for (i = 0; i <= 10; i += 0.0001)
	{
		y = (-i) * i * i + a * i * i;
		if (y > max)
			max = y;
	}
	printf("%.2lf", max);
	return 0;
}

681.模式匹配(2)

803dc2cd84b14a9798a529282d7f3a81.png

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[30] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int flag = 0;
//该题比较简单,故笔者只使用了简单粗暴的穷举法,但实际上该类问题通解可使用指针
	for (i = 0; i < n-2; i++)
	{
		if (arr[i] == 3)
		{
			if (arr[i + 1] == 5)
			{
				if (arr[i + 2] == 7)
				{
					flag++;
				}
			}
		}
	}
	printf("%d", flag);
	return 0;
}

682.判断梅森尼数(3)

b05b96a6eea343e19c28a4fec9542234.png

#include <stdio.h>
int is_mer(int m)//判断是否为素数
//此方法比较简单,但还可优化
//比如将条件控制为 i < sqrt(m)可以减少一半的循环
{
	int i = 0;
	int flag = 1;
	for (i = 2; i <m; i++)
	{
		if (m % i == 0)
		{
			flag = 0;
			break;
		}
	}
	return flag;
}
int my_pow(int x,int n)
{
	if (n > 0)
		return x * my_pow(x, n - 1);
	else 
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int m = my_pow(2, n) - 1;
	if (is_mer(m) == 1)
		printf("%d 1", m);
	else
		printf("%d 0", m);
	return 0;
}

 

683.平滑滤波(3)

67b5222f6ed848d7a3f165bd2e0e5516.png

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int x_arr[30] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &x_arr[i]);
	}
	int y_arr[30] = { 0 };
	for (i = 1; i < n-1; i++)
	{
		y_arr[i] = (x_arr[i-1] + x_arr[i ] + x_arr[i + 1]) / 3;
	}
//本题主要需要注意y的首项与尾项,其余项均为对应x的i、i-1、i+1项之和的均值
	y_arr[0] = y_arr[1];
	y_arr[n-1] = y_arr[n-2];
	for (i = 0; i < n; i++)
	{
		printf("%d ", y_arr[i]);
	}
	return 0;
}

684.logistic方程(4)

832dc4717be74c2b8dfc846e780a1889.png

#include <stdio.h>
#include <math.h>

int main()
{
	double x1 = 0.0;
	double r = 0.0;
	scanf("%lf %lf", &x1, &r);
	int i = 0;
	int flag = 0;//判断符号
	double x[1200] = { 0.0 };
	x[0] = x1;
	for (i = 1; i < 1000; i++)
	{
		x[i] = r * x[i - 1] * (1 - x[i - 1]);//题中所给公式
//通过数学运算,x[i] - x[i - 1]是单调的
		if (fabs(x[i] - x[i - 1]) < 0.00001)//浮点数的绝对值要用fabs
//注意这里的控制条件,题目中的描述是“算出了”,故一旦出现该情况直接跳出循环即可
		{
			flag = 0;
			printf("%.4lf 1", x[i]);
			break;
		}
		else
			flag = 1;
	}
	if (flag == 1)
		printf("%.4lf 0", x[999]);
	return 0;

685.删除特定字符并排序输出(3)

7f86973a927d47728b4d5fb1dc1d90df.png

#include <stdio.h>
void pupple(char s[],int n)///冒泡排序,网上有很多讲解,在此不再赘述
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n-1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (s[j] < s[j - 1])
			{
				int tmp = s[j];
				s[j] = s[j - 1];
				s[j - 1] = tmp;
			}
		}
	}
}
int main()
{
	char str[100] = "*dgjk* %&* *df78dg 88**";//初始化可以不用,笔者是为了方便调试
	gets(str);
	int i = 0;
	char s[100] = "0";
	int sz = 0;//输入字符串长度

	for (i = 0; str[i] != '\0'; i++)
	{
		sz++;
	}
	pupple(str, sz);//对输入字符串根据其ASCII码值进行排序
	int count = 0;
	for (i = 0; str[i] != '*'; i++)
	{
		count++;//记录'*'前元素个数
		s[i] = str[i];
	}
//将'*'前的元素放入新的字符数组
	int star = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		if (str[i]=='*')
			star++;//求出'*'的个数
	}
	for (i = count; str[i] != '\0'; i++)
	{
		s[i] = str[star + i];//跳过'*'将后面的元素放入新数组
	}
	printf("%s\n", s);
	return 0;
}

下面是一位同学提供的另一个相对简便的版本

#include <stdio.h>
void pupple(char s[],int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n-1; i++)
	{
		for (j =i; j <n; j++)
		{
			if (s[i]> s[j])
			{
				char tmp = s[i];
				s[i] = s[j];
				s[j] = tmp;
			}
		}
	}
}
int main()
{   char str[100]="0";
	gets(str);
	int i = 0;
	int sz = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		sz++;
	}
	pupple(str, sz);
	for(i=0;i<sz;i++)
    {
		if(str[i]!='*')
        {
			printf("%c",str[i]);
		}
	}
	return 0;
}

在这位同学的启发下我又写出了一版更简单的 

#include <stdio.h>
#include <string.h>
void pupple(char s[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i; j < n; j++)
		{
			if (s[i] > s[j])
			{
				char tmp = s[i];
				s[i] = s[j];
				s[j] = tmp;
			}
		}
	}
}
int main()
{
	char str[101] = { 0 };
	gets(str);
	int len=strlen(str);
	pupple(str, len);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		if (str[i] != '*')
			printf("%c", str[i]);
	}
	return 0;
}

 

686.校验和(3)

2e65ff223d5e4314ab7af0b4cff21e0d.png

#include <stdio.h>
int get_num(int n)//此函数用于求传入参数各位数之和
{
	int sum = 0;
	if (n > 0)
		return sum + get_num(n / 10) + n % 10;
	else
		return 0;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[20] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += get_num(arr[i]);
	}
	int ret = sum % 10;
	printf("%d\n", ret);
	return 0;
}

687.数值信息报表(3)

907a0c0fb88543c18abfb82162274a77.png

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[50] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += arr[i];
	}
	int max = arr[0];
	int b_flag = 1;
	int min = arr[0];
	int s_flag = 1;
	for (i = 0; i < n; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
			b_flag = i+1;//注意数组下标+1才是元素位置
		}
		if (arr[i] < min)
		{
			min = arr[i];
			s_flag = i+1;
		}
	}
	printf("%d %d %d %d %d", sum, max, b_flag, min, s_flag);
	return 0;
}

 

688.出现次数最多的数(4)

d07072aeba8f43e895d8ab8d91ca30ea.png

#include <stdio.h>
void pupple(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tmp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = tmp;
			}
		}
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[1000] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	pupple(arr, n);//先对数组进行排序,方便后续处理
	if (n == 1)//特殊情况,单独罗列
	{
		printf("%d", arr[0]);
	}

	else
	{
		int count = 1;//元素出现次数,每数完相同元素后会重置为1
//此处要初始化为1,因为一个元素至少出现1次,flag也是如此
		int flag = 1;//记录目前出现最多的次数
		int* st = &arr[0];//把数组首元素地址赋给指针变量,便于遍历数组
		int* ed = &arr[1];
		int num = arr[0];
		for (i = 0; i < n - 1; i++)
		{
			if (*st == *ed)//当两个指针指向的内容相同时,说明此元素重复出现
			{
				ed++;//继续向后遍历
				count++;//记录元素出现次数
			}
			else//发现此元素不再出现
			{
		
				st = ed;//将st指针指向新元素第一次出现的位置
				ed++;//继续遍历
			}
			if (count > flag)//新元素出现次数比之前的出现次数多时
			{
				flag = count;//更新最多出现次数
				num = *st;//记录次元素
				count = 1;
			}
		}
		printf("%d", num);
	}
	return 0;
}

689.寻找同数(4)

d8d9a720583c4fe48bb35b0263a4f099.png

#include <stdio.h>
//由于m限制到了不超过3,故笔者采用了穷举的笨方法,这样写起来比较简单
//此类题通解其实该用指针,思路类似于上一题,大家可以自行尝试
int main()
{
	char m[3];
	char s[50];
	gets(m);
	gets(s);
	int i = 0;
	int count = 0;
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] == m[0])
		{
			if (m[1] != '\0')
			{
				if (s[i + 1] == m[1])
				{
					if (m[2] != '\0')
					{
						if (s[i + 2] == m[2])
						{
							count++;
							continue;
						}
					}
					else
					{
						count++;
						continue;
					}
				}

			}
			else
				count++;
		}
	}
	printf("%d", count);
	return 0;
}

 

690.数字个数统计(2)

ec568444a71047d7a689b365fd45da63.png

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int f_ood = 0;
	int f_eve = 0;
	int f_sp = 0;
	for (i = n; i <= n * n; i++)
	{
		if (i % 2 == 1)
			f_ood++;
		else
			f_eve++;
		if (i % 4 == 0 && i % 3 != 0)
			f_sp++;
	}
	printf("%d %d %d\n", f_ood, f_eve, f_sp);
	int a = f_ood + f_eve;
	int b = f_ood + f_sp;
	int c = f_eve + f_sp;
	int d = a > b ? a : b;
	int max = c > d ? c : d;
	printf("%d", max);
	return 0;
}

691.数列折半交换(3)

8e17074bcf744fa69c3f054d09664bcd.png

#include <stdio.h>
void swap(int* p1, int* p2)//交换量元素的值要用指针,不能直接交换
//这是因为函数中使用的是形参,而形参是对实参(即传进函数中的变量)的一份临时拷贝,对形参的改变不会影响实参
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int arr[30] = { 0 };
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	
	if (n % 2 == 0)
	{
		for (i = 0; i < (n / 2); i++)
		{
			int* p1 = &arr[i];
			int* p2 = &arr[n/2+i];
			swap(p1, p2);
		}
	}
	else
	{
		for (i = 0; i < ((n-1) / 2); i++)
		{
			int* p1 = &arr[i];
			int* p2 = &arr[(n-1) / 2 + i+1];
			swap(p1, p2);
		}
	}
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

692.数字个数统计(2)

9acfa00f15474b8e959260cde9132685.png

#include <stdio.h>
//注意求余时被除数和除数的顺序
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int min = a < b ? a : b;
	int max = a > b ? a : b;
	int i = 0;
	int c3 = 0;
	int c4 = 0;
	int c5 = 0;
	for (i = min; i <= max; i++)
	{
		if (i % 3 == 0)
			c3++;
		if (i % 4 == 0)
			c4++;
		if (i % 5 == 0&&i%2!=0)
			c5++;
	}
	printf("%d %d %d\n", c3, c4, c5);
	int x = c3 % c4;
	int y = c3 % c5;
	int z = c4 % c5;
	int q = c4 % c3;
	int r = c5 % c3;
	int t = c5 % c4;
	int A = x > y ? x : y;
	int B = z > q ? z : q;
	int C = r > t ? r : t;
	int big = A > B ? A : B;
	int imax = C > big ? C : big;
	printf("%d", imax);
	return 0;

693.有序序列插值(3)

8d7408eb90d54eb6b04d4b95e5919c0d.png

 

void pupple(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tmp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = tmp;
			}
		}
	}
}
int main()
{
	int n = 0;
	int arr[30] = { 0 };
	scanf("%d", &n);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int m = 0;
	scanf("%d", &m);
	arr[n] = m;
	pupple(arr, n + 1);
	for (i = 0; i < n + 1; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

694.数字统计(2)

d5be8ed4ad1b483785d1526f24c97b7b.png

#include <stdio.h>

int main()
{
	int m = 0;
	int k = 0;
	scanf("%d %d", &m, &k);
	int arr[200] = { 0 };
	int i = 0;
	arr[0] = 2;
	arr[1] = 3;
	for (i = 2; i < k; i++)
	{
		arr[i] = i*i + 3 * (i - 1) + 1;
	}
	int e = 0;
	int r = 0; 
	int b = 0;
	for (i = 0; i < k; i++)
	{
		if (arr[i] % m == 0)
			e++;
		if (arr[i] % m == 1)
			r++;
		if (arr[i] % m > 1)
			b++;
	}
	printf("%d %d %d", e, r, b);
	return 0;
}

695.等差数列及位置指示(4)

f6c2a8b06e504683b8a4bcf812a7c136.png

#include <stdio.h>
void pupple_pro(int arr[], int b[],int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tmp = arr[j];
				int temp = b[j];
				b[j] = b[j - 1];
				b[j - 1] = temp;
				arr[j] = arr[j - 1];
				arr[j - 1] = tmp;
			}
		}
	}
}
int main()
{
	
	int n = 0;
	int arr[100] = { 0 };
	scanf("%d", &n);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	
	int b[100] = { 0 };//记录arr数组中的元素位置
	for (i = 0; i < n; i++)
	{
		b[i] = i + 1;
	}
	pupple_pro(arr,b, n);//将b数组一起排序

	int flag = 0;
	for (i = 1; i < n-1; i++)
	{
		if (arr[i] - arr[i - 1] == arr[i + 1] - arr[i])
		{
			flag = 1;
		}
		else
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
	{
		for (i = 0; i < n; i++)
		{
			printf("%d ", b[i]);
		}
	}
	else
	{
		int max = arr[1] - arr[0];
		int min = arr[1] - arr[0];
		for (i = 1; i < n; i++)
		{
			if (arr[i] - arr[i - 1] > max)
			{
				max = arr[i] - arr[i - 1];
			}
			if (arr[i] - arr[i - 1] < min)
			{
				min = arr[i] - arr[i - 1];
			}
		}
		printf("%d %d", max, min);
	}
	return 0;
}

696.交换最大值与最小值(3)

d7907292c7fb42ecbf4148b96bbc6015.png

#include <stdio.h>
void pupple(int arr[],int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tmp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = tmp;
			}
		}
	}
}
void swap(int* pa, int* pb)
{
	int tmp = *pb;
	*pb = *pa;
	*pa = tmp;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[20] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	int b[20] = { 0 };
	for (i = 0; i < n; i++)
	{
		b[i] = arr[i];//将arr数组放到b数组中
	}
	pupple(b,n);//对b数组排序,方便求最大与最小值

	int* p1 = &arr[0];
	int* p2 = &arr[n - 1];
	for (i = 0; i < n; i++)
	{
		if (arr[i] == b[0])
		{
			int *pmin = &arr[i];
			swap(p1, pmin);
		}
		if (arr[i] == b[n-1])
		{
			int *pmax = &arr[i];
			swap(p2, pmax);
		}
	}
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 

697.出租车计费(1)

21260b5cbd1a4fd2bc94e8f4677f1e70.png

#include <stdio.h>

int main()
{
	double s = 0.0;
	int t = 0;
	double fee = 0.0;
	scanf("%lf %d", &s, &t);
	double tc = (t / 5) * 2.0;
	if (s <= 3)
	{
		fee = 10.0+tc;
	}
	else if (s > 3 && s <= 10)
	{
		fee = 10 + (s - 3) * 2.0+tc;
	}
	else
	{
		fee = 10 + 14.0 + (s - 10) * 3+tc;
	}
	printf("%.1f", fee);
	return 0;
}

698.乘法口诀数列(5)

ae98d2ce2c3c4832ab2146602c7defd2.png

#include <stdio.h>
int count_num(int x)//计算数位函数
{
	int count = 0;
	if (x == 0)
	{
		count = 1;
	}
	else
	{
		while (x)
		{
			x /= 10;
			count++;
		}
	}
	return count;
}

int main()
{
	int a1 = 0;
	int a2 = 0;
	int n = 0;
	scanf("%d %d %d", &a1, &a2, &n);
	int arr[100] = { 0 };
	int i = 0;
	arr[0] = a1;
	arr[1] = a2;
	int v = 2;
	for (i = 2; i < n; i+= count_num(arr[v - 1] * arr[v - 2]),v++)
// i+= count_num(arr[v - 1] * arr[v - 2])让i跳过相应的位数
	{
		int m = count_num(arr[v - 1] * arr[v - 2]);
		int j = 0;
		int s = arr[v-1] * arr[v - 2];
		for (j = m + i - 1; j>= i; j--)
		{
			arr[j] =s % 10;
			s /= 10;
		}//将结果的数位从后向前赋给数组
	
	}
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 

699.歌唱比赛评分(3)

c9da2c0b91d54fc0a4f2a670f88cad91.png

#include <stdio.h>
void pupple(int arr[], int n)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = n - 1; j > i; j--)
		{
			if (arr[j - 1] > arr[j])
			{
				int tmp = arr[j];
				arr[j] = arr[j - 1];
				arr[j - 1] = tmp;
			}
		}
	}
}
int main()
{
	int n = 0;
	int m = 0;
	int arr[20] = { 0 };
	scanf("%d %d", &n, & m);
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}
	float goal = 0.00;
	float sum = 0.00;
	int b[20] = { 0 };
	for (i = 0; i < n; i++)
	{
		b[i] = arr[i];
	}
	pupple(arr,n);
//需注意,当出现两个及以上的最低分或最高分时,若其中一个是组长给出,则该分数全部纳入计算,不在舍去
	if (b[m-1] == arr[0])
	{
		for (i = 0; i < n-1; i++)
		{
			sum += arr[i];
		}
		goal = sum / (n - 1.00);
	}
	else if (b[m-1] == arr[n - 1])
	{
		for (i = 1; i < n ; i++)
		{
			sum += arr[i];
		}
		goal = sum / (n - 1.00);
	}
	else
	{
		for (i = 1; i < n - 1; i++)
		{
			sum += arr[i];
		}
		goal = sum / (n - 2.00);
	}
	printf("%.2f", goal);
	return 0;
}

700.分别计算奇数和偶数之和(3)

 045b590b7be141b9811798791ffe14a4.png

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int sum_ood = 0;
	int sum_eve = 0;
	for (i = 1; i <= n; i++)
	{
		if (i % 2 == 0)
			sum_eve += i;
		else
			sum_ood += i;
	}
	printf("%d %d", sum_ood, sum_eve);
	return 0;
}

 

701.异常点检测(3)

fb4024a6020147fa896e2faef16ade5d.png

 

#include <stdio.h>
#include <math.h>
int main()
{
	int n = 0;
	double arr[100] = { 0.0000 };
	int i = 0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf(" %lf", &arr[i]);
	}
	double sum = 0.0000;
	for (i = 0; i < n; i++)
	{
		sum += arr[i];
	}
	double ave = 1.0000 * sum / n;
	double s = 0.0000;
	for (i = 0; i < n; i++)
	{
		s += (arr[i] - ave) * (arr[i] - ave);
	}
	double sp = s / (n - 1.0000);
	double S = sqrt(sp * 1.0000);
	int count = 0;
	for (i = 0; i < n; i++)
	{
		if (arr[i]< ave - 3.0000 * S || arr[i]>ave + 3.0000 * S)
			count++;
	}
	printf("%.4lf %d", S, count);
	return 0;
}

702.最长的整数序列(3)

157a7348f3a6461c86ef29d199ae4dbf.png

#include <stdio.h>
//思路与688题基本一致,稍加改动即为本题,不再赘述
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[1000] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}

	if (n == 1)
	{
		printf("1");
	}

	else
	{
		int max = 1;
		int* st = &arr[0];
		int* ed = &arr[1];
		while (n)
		{
			if (*st == *ed)
			{
				ed++;
			}
			else
			{
				if (max < ed - st)
				{
					max = ed - st;
				}
				st = ed;
				ed++;
			}
			n--;
		}
		printf("%d", max);
	}
	return 0;
}

 

703.最小公倍数求和(3)

204578c832a44834872ec6ca6fede6fb.png

#include <stdio.h>
int get_mti(int a, int b)//辗转相除法
//同时有一个关系值得记忆
//两数积=最大公约数*最小公倍数
{
	int x = a;
	int y = b;
	while (b)
	{
		int tmp = a % b;
		a = b;
		b = tmp;
	}
//此时求得a为最大公约数
	return x*y/a;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[100] = { 0 };
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf(" %d", &arr[i]);
	}

	int sum = 0;
	for (i = 0; i < n - 1; i++)
	{
		sum+=get_mti(arr[i], arr[i + 1]);
	}
	printf("%d", sum);
	return 0;
}

 

704.字符串处理1(3)

a2bc567402ac4afc85497d9ab280d1ba.png

#include <stdio.h>
int main()
//符合16进制数据格式的数字与字符有“0~9”“A~F”“a~f”,其中A~F,a~f的十进制大小均为10~15
{
	char str[60];
	gets(str);
	int i = 0;
	int sum = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		if (str[i] <= '9' && str[i] >= '0')
		{
			sum = sum + str[i]-'0';
		}
		else if (str[i] >= 'A' && str[i] <= 'F')
		{
			sum = sum + str[i]-'A'+10;
		}
		else if (str[i] >= 'a' && str[i] <= 'f')
		{
			sum = sum + str[i] - 'a' + 10;
		}
	}
	int flag = 0;
	if (sum == 0)
	{
		for (i = 0; str[i] != '\0'; i++)
		{
			if (str[i] == '0')
			{
				flag = 1;
				break;
			}
		}
		if (flag == 1)
			printf("0");
		else
			printf("No");
	}
	else
		printf("%d", sum);
	return 0;
}

 

705.数组折叠(4)

3347e207eb6e4b0d9d2dd6355b248d55.png

#include <stdio.h>
#include <math.h>
int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &n, &m);
	int k = pow(2.0, n);//输入数组元素数
	int K = k;
	int l = pow(2.0, m);//折叠m次后的份数
	int i = 0;
	int arr[70] = { 0 };
	for (i = 0; i < k; i++)
	{
		scanf(" %d", &arr[i]);
	}

	while(m)
	{
		for (i = 0; i < k / 2; i++)
		{
			arr[i] = arr[i] + arr[k - i - 1];
			arr[k - 1 - i] = 0;
		}
		i = 0;
		k /= 2;
		m--;
	}
	
	for (i = 0; i < K / l; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 

706.字符串插(4)

3f5e8954172743b384867318bf35d4dd.png

#include <stdio.h>
int main()
{
	char mjs[20] = {'\0'};//这里所有字符数组一定要初始化为'\0',否则最后会出现乱码
	char ips[20] = { '\0' };//插入数组
	int n = 0;
	char res[20] = { '\0' };//原剩余数组
	gets(mjs);
	gets(ips);
	scanf("%d", &n);
	int i = 0;
	int j = 0;
	for (i = n; mjs[i] != '\0'; i++)
	{
		res[j] = mjs[i];
		j++;//先将原数组中插入数组的位置后的元素拿出来放入res
	}
	int k = 0;
	for (i = n; ips[k] != '\0'; i++)
	{
		mjs[i] = ips[k];
		k++;//将插入数组从插入位置放入
	}
	int l = 0;
	for (i = n + k; res[l] != '\0'; i++)
	{
		mjs[i] = res[l];
		l++;//将res放回原数组插入数组的后面
	}
	for (i = 0; mjs[i] != '\0'; i++)
	{
		printf("%c", mjs[i]);
	}
	return 0;
}

 

707.判断字符串子串(4)

6f22bc1e902348659fba15f5e899fc9f.png

#include <stdio.h>
//思路与688题相近,不再赘述
int main()
{
	char maj[20];
	char str[20];
	gets(maj);
	gets(str);
	char* st = &maj[0];
	char* ed = &maj[0];
	int i = 0;
	int sz = 0;
	for (i = 0; str[i] != '\0'; i++)
	{
		sz ++;
	}
	int flag = 0;
	int sign = 0;
	int start = 0;
	for (i = 0;maj[i]!='\0'; i++)
	{
		if (*st == str[0])
		{
			int j = 0;
			ed = st;
			for (j = 0; j < sz; j++)
			{
				if (*ed == str[j])
				{
					ed++;
					flag ++;
				}
				else
				{
					flag = 0;
					st++;
					break;
				}
				if (flag == sz)
				{
					sign = 1;
					start = i+1;
					break;
				}
			}
		}
		else
		{
			st++;
		}
		if (sign == 1)
		{
			break;
		}
	}
	if (sign == 0)
	{
		printf("No!");
	}
	else
	{
		printf("%d", start);
	}
	return 0;
}

 

708.奇偶求和(3)

 

465d69f8ed57490d921cbe7f2ace03ad.png

#include <stdio.h>
int main()
{
	int m = 0;
	scanf("%d", &m);
	int arr[10000] = { 0 };
	int i = 0;
	int M = m - 1;
	for (i = 0; i < 10000; i++)
	{
		arr[i] = 3 * i * i + 2 * i + 1;
	}
	int sum_eve = 0;
	int sum_odd = 0;
	for (i = 0; m != 0; i++)
	{
		if (arr[i] > 100 && arr[i] % 2 == 0)
		{
			sum_eve += arr[i];
			m--;
		}
	}
	for (i = 0;M!= 0; i++)
	{
		if (arr[i] > 100 && arr[i] % 2 == 1)
		{
			sum_odd += arr[i];
			M--;
		}
	}
	printf("%d %d", sum_eve, sum_odd);
	return 0;
}

 经历了两天终于肝完了,完结撒花!!!ヾ(✿゚▽゚)ノ

中间可能有些方法不是最优,毕竟本人水平有限。o(╥﹏╥)o

最后,祝大家期末都能取得好成绩!(*^▽^*)

 

  • 151
    点赞
  • 328
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只菜咕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值