题库共计36道题,会从中选取两道作为期末原题。
笔者为加强自身理解,同时也为同学们提供一点思路写这篇博客。
(这是笔者第一次写博客,如有不当之处敬请谅解并不吝指正)
难度划分:
1 难度较低,通过简单语句即可实现
2 考查了一些易错知识点或者有一定的巧法
3 有一些易被忽略的特殊情况,对数学逻辑有一定的考察
4 通过巧法可以快速解决,但不易想出,常规方法比较麻烦,可以记一下大致思路
5 考场上很难快速完成,可能会影响心态,建议直接背
671.方差计算(1)
#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)
#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)
#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;
674.信号解调(2)
#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)
#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)
#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;
}
677.勒让德多项式(2)
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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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)
#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
最后,祝大家期末都能取得好成绩!(*^▽^*)