Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

这就是数学题啊

Posted by sbtdkj1017 at 2014-10-24 20:34:55 on Problem 1117
In Reply To:注意了,这题不是数学题,是一个较好的递归题,0ms不轻松解决! Posted by:1272406003 at 2009-08-04 13:09:09
将数分三段,高位H,低位L,中间被strike掉的位S,则
X=(10H+S)*10^i+L (i = 0, 1, 2 ... 最多log10(N))
Y=H*10^i+L
N=X+Y=(11H+S)*10^i + 2L
将N/(10^i)得(11H+S) + 2L/(10^i),其中2L/(10^i)只可能为0和1,再加上i的不到10种取值,共20种不到的组合
每种组合都验证一下,答案就出来了

#include <iostream>
#include <iomanip>
#include <map>
using namespace std;
int main()
{
	long N, H, S, I, L, X, i = 0;
	map<long, long> result, ri;
	cin >>  N;
	for (I = 1; I <= N; I *= 10, i++) {
		if (N % I % 2) continue;
		H = N / I / 11;
		L = N % I / 2;
		S = N / I % 11;
		if (S < 10) {
			X = (10 * H + S) * I + L;
			if (H + S) result[X] = H * I + L;
			ri[X] = i;
		}
		L = (N % I + I) / 2;
		S = N / I % 11 - 1;
		if (S >= 0 && L) {
			X = (10 * H + S) * I + L;
			if (H + S) result[X] = H * I + L;
			ri[X] = i;
		}
	}
	cout << result.size() << endl;
	for (map<long, long>::iterator it = result.begin(); it != result.end(); ++it)
		cout << it->first << " + " << setw(ri[it->first]) << setfill('0') << it->second << " = " << N << endl;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator