POJ 3982 序列 大数题解

又是一道大数相加的题目,直接模板或者Java都可以水过了。

循环相加33次就可以了,计算出A99是第几个,准确输出答案。

#include <stdio.h>
#include <string>
#include <algorithm>
using std::string;

const int MAX_B = 5120;
char buf[MAX_B];
int id = 0, len = 0;

inline char getFromBuf()
{
	if (id >= len)
	{
		len = fread(buf, 1, MAX_B, stdin);
		id = 0;
	}
	return buf[id++];
}

void getIntFromBuf(string &n)
{
	char a = getFromBuf();
	while ((a == ' ' || a == '\n') && len) a = getFromBuf();

	n.clear();
	while ((a != ' ' && a != '\n') && len)//老是写&&,错成||
	{
		n.push_back(a);
		a = getFromBuf();
	}
}

string operator+(string &a, string &b)
{
	string c;
	int N1 = (int)a.size(), N2 = (int)b.size();
	int carry = 0;
	for (int i = N1-1, j = N2-1; i>=0 || j>=0 || carry; i--, j--)
	{
		int an = i>=0? a[i]-'0' : 0;
		int bn = j>=0? b[j]-'0' : 0;
		int sum = an + bn + carry;
		carry = sum / 10;
		c.push_back(sum % 10 + '0');
	}
	reverse(c.begin(), c.end());
	return c;
}

int main()
{
	string a1, a2, a3;
	while (true)
	{
		getIntFromBuf(a1);
		if (len == 0) break;
		getIntFromBuf(a2);
		getIntFromBuf(a3);

		for (int i = 0; i < 33; i++)
		{
			string a = a2 + a3;
			a1 = a1 + a;
			if (i == 32) break;
			a2 = a1 + a;
			a3 = a3 + a1;
			a3 = a3 + a2;
		}
		puts(a1.c_str());
	}
	return 0;
}

POJ 3982 序列 大数题解,布布扣,bubuko.com

时间: 2024-08-03 19:24:19

POJ 3982 序列 大数题解的相关文章

POJ 3982 序列(JAVA,简单,大数)

题目 //在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, //可以先建立对象,然后通过对象调用方法: import java.io.*; import java.util.*; import java.math.*; public class Main { /** * @xqq */ public BigInteger a99(BigInteger a, BigInteger b, BigInteger c) { f

Poj 3982 序列

1.Link: http://poj.org/problem?id=3982 2.Content: 序列 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7057   Accepted: 3182 Description 数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 和 A2, 计算A99 Input 输入包含多行数据 每行数据包含3个整数A0, A1, A2 (0

POJ 3982 序列 [解题报告] Java

序列 问题描述 : 数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 和 A2, 计算A99 输入: 输入包含多行数据 每行数据包含3个整数A0, A1, A2 (0 <= A0, A1, A2 <= 32767) 数据以EOF结束 输出: 对于输入的每一行输出A99的值 样例输入: 1 1 1 样例输出: 69087442470169316923566147 代码实现: //* @author: import java.util.*;

POJ 3420 Quad Tiling 题解 《挑战程序设计竞赛》

POJ 3420 Quad Tiling贴瓷砖:4*N的地板上用2*1的瓷砖铺满,求所有方案数对M求余.3.4熟练掌握动态规划矩阵的幂久违地上了节课,太无聊,只好刷一题.假设S[n]表示填满n时的方案数,有S[0]=1.定义矩阵M[p][q] := 边缘p和边缘q可以拼合时取1,否则取0所谓的可以拼合表示,两个边缘拼起来后长度为1(为2就拼接不起来了),且内部缝隙可以用2*1的瓷砖填满.那么M就有一些简单的性质了,比如M的第一行应该是:0 0 0 0 0 0... 继续阅读:码农场 » POJ

POJ 1019 Number Sequence 题解

这又是一道看似简单,实际挺困难的题目. 本来想做道基础题消遣一下的,没想到反被消遣了-_-|||. 看个人的基础吧,对于数学好的会简单点,但是由于情况太多,需要都考虑全,故此难度应该在4星以上了. 我这里使用的方法就是直接打表,然后直接模拟,利用打表去掉一大段数据,剩下数据量十分小了,故此可以直接模拟. 打表是为了计算前面的周期数,把周期数直接去掉. 主要难点是后面10位数以上的数有2位, 3位,4位等情况要考虑.- 下面使用getNewNums一个函数解决了,想通了,就几行代码,还不用难理解的

POJ 3411 Paid Roads 题解 《挑战程序设计竞赛》

POJ 3411 Paid Roads开路:N个城市间有m条单向路,分别从a到b,可以在c处交P路费,也可以直接交R路费.那么问题来了,你的挖掘机怎么开最省钱?3.4熟练掌握动态规划状态压缩DP乍一看可以Dijkstra,实际上的确可以Dijkstra.不过多了一个预交费的c,所以在遍历的时候多了一维状态,这个维度储存当前走过的城市集合.在Dijkstra的时候,如果走过了c那么就有两个选择,选其中最省的即可:否则没得选.#include <iostream> #include&nb.

POJ 2499 Binary Tree 题解

本题使用所谓的辗转相除法. 还需要逆过来遍历二叉树.可以想象给出的数据点是根节点,然后遍历到根节点(1,1). 考的是根据给出的规则,总结规律的能力. #include <stdio.h> namespace BinaryTree2499_1 { int main() { int T, a, b, le, ri; scanf("%d", &T); for (int t = 1; t <= T; t++) { scanf("%d %d", &

bzoj 1858: [Scoi2010] 序列操作 题解

[原题] 1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1031  Solved: 529 [Submit][Status] Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内

poj 2429 Pollard_rho大数分解

先对lcm/gcd进行分解,问题转变为从因子中选出一些数相乘,剩下的数也相乘,要求和最小. 这里可以直接搜索,注意一个问题,由于相同因子不能分配给两边(会改变gcd)所以可以将相同因子合并,这样的话,搜索的层数也变的很少了. #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<stdlib.h> #include<time.h&g