现在的位置: 首页 > 综合 > 正文

1~n 个数叠加求和

2013年01月20日 ⁄ 综合 ⁄ 共 1006字 ⁄ 字号 评论关闭

这里我用到了数学高斯公式:sum = (首项+末项) * 项数 / 2;

#include <stdio.h>
#include <string.h>
void Cal(int a, int b)
{
	
	int result[100],real[100];
	memset(result, 0, sizeof(result));
	memset(real, 0, sizeof(real));
	
	int div_a = a / 9;
	int last = a - div_a * 9;

	int digit = 0, f, j;
	result[0] = 1;
	for(j = 0, f = 0; j <= digit || f > 0; j++)
	{
		int x = result[j] * b + f;
		f = x / 10;
		result[j] = x % 10;
	}
	while(result[j] == 0) j--;
	digit = j; // 将 b 的值赋到result 中

	int  real_digit = digit;
	for(int nn = digit; nn >= 0; nn--)
		real[nn] = result[nn];

	for(j = 0, f = 0; j <= digit || f > 0; j++)
	{
		int x = result[j] * 9 + f;
		f = x / 10;
		result[j] = x % 10;
	}
	while(result[j] == 0) j--;
	digit = j; // 得到单个的值

	for(j = 0, f = 0; j <= digit || f > 0; j++)
	{
		int x = result[j] * div_a + f;
		f = x / 10;
		result[j] = x % 10;
	}
	while(result[j] == 0) j--;
	digit = j; // 乘以次数

	digit = real_digit;
	for(j = 0, f = 0; j <= digit || f > 0; j++)
	{
		int x = real[j] * last + f;
		f = x / 10;
		real[j] = x % 10;
	}
	while(real[j] == 0) j--;
	digit = j; // 剩余的数

	int jinwei = 0;
	for(int mm = 0; mm < 100; mm++)
	{
		int x = real[mm] + result[mm] + jinwei;
		jinwei = x / 10;
		real[mm] = x % 10; // 最后相加
	}
	int i = 99;
	while(real[i] == 0) i--; // 得到值的位数
	for(j = i; j >= 0; j--)
		printf("%d",real[j]);
	printf("\n");
}

int main()
{
	int a;
	scanf("%d",&a);

	Cal(a/2,a+1);

	return 1;
}

抱歉!评论已关闭.