ZOJ-1210


大数演算は、JAVAなら数行のコードで済みますが、これは私の500題マイルストーンで、このままサボるわけにはいきません!今後のために手本を立てなければならない.思い切ってC++で書き換えたのですが、大数除算法を小数階乗1/2^Nに変換すると演算(0.5)^Nとなり、さらに5のべき乗に変換して、0の桁数とか別に計算すればいいのですが、これで直接計算よりも効率が上がるかどうか、コードを添付しましょう.
ちなみに500題ACは達成して、去年の12月から今までも9ヶ月の時間があって、私は自分のコード能力がまだ進歩していると思って、結局1行のコードは1行のコードの蓄積があって、コード量を統計したことがなくて、しかし500題はどうしても3 W行ぐらいの代コードがあって、500題の中で水題が圧倒的に大多数を占めたと言っていますが.これまでBFS、DFSなど何も知らなかったことから今まで简単な検索アルゴリズムを书くことができて、考え方もずいぶん広くなって、図论、データ构造、大数、DPの方面はすべて一定の渉猟があって、以前JAVAコードを书く时メモリの方面からコードの品质を考虑したことがありません結局C/C++の使用はきっとメモリの使用に対する感度が向上することができて、多くも言わないで、この500題だけでかつてZJUで逝去した青春に捧げて、および未来の自分を励まして、いつかもし可能であれば、私は1つまた1つの先輩たちを超えることができて、ZOJの第1版に入って、わあはは!コードがあなたと私と一緒にいて、頑張ってください!
#include
#include
#include

using namespace std;

namespace
{
	string power(int base, int p)
	{
		string res = "1", temp;
		int carry, t;
		while (p--)
		{
			temp.clear();
			carry = 0;
			for (size_t i = 0; i < res.size(); i++)
			{
				t = base * (res[i] - '0') + carry;
				carry = t / 10;
				temp += t % 10 + '0';
			}
			if (carry)
				temp += carry + '0';
			res = temp;
		}
		reverse(res.begin(), res.end());
		return res;
	}

	string& remove_leading_zero(string &s)
	{
		while (s[0] == '0')
			s.erase(0, 1);
		return s;
	}

	int calc(const string &str, int base)
	{
		string temp, s = str;
		int res = 0;
		while (s != "1")
		{
			temp.clear();
			int rem = 0;
			for (size_t i = 0; i < s.size(); i++)
			{
				rem = rem * 10 + (s[i] - '0');
				temp += (rem / base + '0');
				rem = rem % base;
			}
			remove_leading_zero(temp);
			s = temp;
			res++;
		}
		return res;
	}

	int remove_tail_zero(string &s)
	{
		int end = s.size(), count = 0;
		while (s[--end] == '0')
			count++;
		s.erase(end + 1, count);
		return count;
	}

	void print_zero(int n)
	{
		while (n--)
			putchar('0');
	}
}

int main()
{
	puts("Problem 4 by team x");
	string s;
	while (cin >> s)
	{
		printf("
1 / %s =
", s.c_str()); int tail = remove_tail_zero(s); putchar('0'); putchar('.'); if (s[s.size() - 1] == '1') { print_zero(tail - 1); puts("1"); } else { int base = s[s.size() - 1] == '5' ? 5 : 2; int p = calc(s, base); string pow = power(10 / base, p); print_zero(tail + p - pow.size()); puts(pow.c_str()); } } puts("End of problem 4 by team x"); return 0; }

JAVAサボり版コード.
import java.math.BigDecimal;
import java.util.Scanner;

public class Main
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		System.out.println("Problem 4 by team x");
		while (sc.hasNextLine())
		{
			String line = sc.nextLine();
			System.out.format("
1 / %s =
", line); System.out.println(BigDecimal.ONE.divide(new BigDecimal(line)) .toPlainString()); } System.out.println("End of problem 4 by team x"); sc.close(); } }