题目:一个举行内有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; }
时间: 2024-11-06 13:36:30