杭电1012题

很水的一道题,但是用了很多时间一直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);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值