很水的一道题,但是用了很多时间一直AC不过,后来用了下面的代码(1)生成数据,然后再在代码(2)将每一个数据打印出来竟然AC了,最后代码(3)是某位大牛的,先借过来贴一下,以后有时间在观摩。对于代码(2)关键是第8个数据中最后一个‘0’要加上才能AC。水平有限,如果谁看出我的WA代码,即代码(1)哪里能改进的,欢迎指正。
代码(1)
#include<stdio.h>
int main(){
int i,j,n;
int cal;
double sum[10];
for(n=0;n<=9;n++){
sum[n]=0;
for(i=1;i<=n;i++){
cal=1;
for(j=1;j<=i;j++)
cal*=j;
sum[n]+=((double)1)/((double)cal);
}
sum[n]+=1;
}
printf("n e\n");
printf("- -----------\n");
for(i=0;i<10;i++)
printf("%d %.9f\n",i,sum[i]);
return 0;
}
代码(2)
#include <stdio.h>
int main(){
printf("n e\n");
printf("- -----------\n");
printf("0 1\n");
printf("1 2\n");
printf("2 2.5\n");
printf("3 2.666666667\n");
printf("4 2.708333333\n");
printf("5 2.716666667\n");
printf("6 2.718055556\n");
printf("7 2.718253968\n");
printf("8 2.718278770\n");
printf("9 2.718281526\n");
}
代码(3)
#include <stdio.h>
#include <stdlib.h>
#include <string>
void main()
{
int i, j, n, k;
double e;
int v, s = 0;
int decimal, sign;
char* buffer;
int precision = 11;
char out[12];
printf("n e\n");
printf("- -----------\n");
for (n = 0; n <= 9; ++n)
{
e = 0;
for (i = 0; i <= n; ++i)
{
if (i == 0)
v = 1;
else
v *= i;
e += (double) 1.0 / v;
}
buffer = _ecvt(e, precision, &decimal, &sign);
for (j = 10; j >= 0; --j)
{
if (buffer[j] != '0')
break;
}
if (j != 0)
{
int add = 0, v;
if (j == 10)
{
add = buffer[j]-'0'>=5?1:0;
j = j-1;
}
else
add = 0;
for (k = j, i = k+1; i >= 0; --i)
{
if (i == decimal)
out[i] = '.';
else
{
if (add != 0)
{
v = buffer[k--]-'0' + add;
out[i] = v%10 + '0';
add = v/10;
}
else
out[i] = buffer[k--];
}
}
out[j+2] = '\0';
}
else
{
out[0] = buffer[0];
out[1] = '\0';
}
printf("%d %s\n", n, out);
}
}