您的位置:首页 > 其它

UVa 10519 - !! Really Strange !!

2015-05-17 15:30 393 查看
题目:一个举行内有n和圆,他们分别互相相交于不同的两个点,问他们把平面分成几部分。

分析:大整数,递推。F(n)= F(n-1)+ 2(n-1)。

如果已有n-1个圆,加入第n个,分别与前n-1个圆相交生成2(n-1)个点,圆分割成2(n-1)段弧;

每段弧会把他所属的区域一分为二,F(n)= n(n-1)+ 2 { 其中,n ≥ 1 }。

说明:注意输入为0特殊处理。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

char buf[202];
int  number1[202];
int  number2[202];
int  number3[202];

int main()
{
	while (~scanf("%s",buf)) {
		int l = strlen(buf);
		if (l == 1 && buf[0] == '0') {
			printf("1\n");
			continue;
		}
		
		memset(number1, 0, sizeof(number1));
		memset(number2, 0, sizeof(number2));
		memset(number3, 0, sizeof(number3));
		for (int i = 0; buf[i]; ++ i) {
			number1[l-1-i] = buf[i]-'0';
			number2[l-1-i] = buf[i]-'0';
		}
		
		number1[0] --;
		for (int i = 0; i < l; ++ i) 
			if (number1[i] < 0) {
				number1[i+1] --;
				number1[i] += 10;
			}
		
		for (int i = 0; i < l; ++ i)
		for (int j = 0; j < l; ++ j)
			number3[i+j] += number1[i]*number2[j];
		
		number3[0] += 2;
		for (int i = 0; i < 200; ++ i)
			if (number3[i] > 9) {
				number3[i+1] += number3[i]/10;
				number3[i] %= 10;
			}
			
		int end = 200;
		while (end > 0 && !number3[end]) -- end;
		
		while (end >= 0) printf("%d",number3[end --]);
		printf("\n");
	}
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: