本题难点: 如何对实数的小数位进行截取。方法如下:
char temp[1000];
double m;
sprintf(temp,"%.klf",m);
sscanf(temp,"%lf",&m);
使用该方法可以截取实数m小数点后的k位。
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <deque>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <iomanip>
using namespace std;
///
#define INF 0xffffff7
#define maxn 10010
///
char tempc[1010];
double data[1010];
int main()
{
///
int i, j;
int N;
double sum, ave;
double ans1, ans2;
while (1)
{
scanf("%d", &N);
if (N == 0)
break;
sum = 0;
for (i = 0; i < N; i++)
{
double temp;
scanf("%lf", &temp);
sum += temp;
data[i] = temp;
}
ave = sum / N;
sprintf(tempc, "%.2lf", ave);
sscanf(tempc, "%lf", &ave);
ans1 = ans2 = 0;
for (i = 0; i < N; i++)
{
if (data[i] > ave)
{
ans1 += data[i] - ave;
}
else
ans2 += ave - data[i];
}
if (ans1 > ans2)
printf("$%.2lf\n", ans2);
else
printf("$%.2lf\n", ans1);
}
///
return 0;
}