4.1题目
算法实现题4-13 数列极差问题
★问题描述:在黑板上写了N个正数组成的一个数列,进行如下操作:每一次擦去其中2个数,设为a和b,然后在数列中加入一个数ab+1,如此下去直至黑板上只剩下一个数。在所有按这种操作方式最后得到的数中,最大的数记为max,最小的数记为min,则该数列的极差M定义为M=max-min。
★算法设计:对于给定的数列,计算出其极差M。
数据输入:由文件input.txt给出输入的数列,第一行是数列的长度N(不超过2000),第二行起是数列中的N个数,相邻2个数由空格分隔。文件名由键盘输入。
结果输出:将计算的数列极差M写入文件output.txt。结果应分两行输出,第一行是数M的位数,第二行是数M。
输入文件示例 输出文件示例
Input.txt output.txt
3 1
1 1 1 0
4.2分析
应用贪婪算法,由小到大运算为最大,由大到小运算为最小,两者相减得极差,再循环除10得其位数。
4.3源代码
#include <iostream>
#include<stdio.h>
void sort(int* p, int size);//顺序冒泡排序
int main()
{
FILE* fpr, * fpw;
fopen_s(&fpr, "input.txt", "r");
fopen_s(&fpw, "output.txt", "w");
int j, x[100], y[100], a[100], i, n, z = 0, b[2], M;
fscanf_s(fpr, "%d", &n);
for (i = 0; i < n; i++)
fscanf_s(fpr, "%d", a + i);
sort(a, n);
for (i = 0; i < n; i++)
{
if (i == 0)
x[0] = a[0] * a[++i] + 1;
else
x[z] = x[z - 1] * a[i] + 1;
z += 1;
}
z = 0;
for (i = n-1; i >= 0; i--)
{
if (i == (n - 1))
y[0] = a[n-1] * a[--i] + 1;
else
y[z] = y[z - 1] * a[i] + 1;
z += 1;
}
M = x[z - 1] - y[z - 1];
printf("极差%d\n", M);
if (M == 0)
i = 1;
else
for (i = 0; M > 0; i++)
M /= 10;
printf("输出为%d位数", i);
fprintf(fpw, "%d\n", i);
fprintf(fpw, "%d\n", M);
fclose(fpr);
fclose(fpw);
return 0;
}
void sort(int* p, int size)//顺序冒泡排序
{
int i, b[10], j, k;
for (i = 0; i < size - 1; i++)
for (j = i + 1; j < size; j++)
if (p[i] > p[j])
{
k = p[i];
p[i] = p[j];
p[j] = k;
}
}
4.4运行结果
4.5总结
在一次次算法思路求解的过程中对c语言的理解不断加深,虽然距离竞赛水平还差得远,但是毕竟也在一点点进步。