去掉数字里面一位数的问题

hdoj 1271 整数对

看了别人的解题报告,再次对自己数学能力表示悲哀~~~~~~

对于这种问题,我们通常可以把这个数表示成这样:A = a*10^(k+1) + b*10^k + c ,b表示去掉的那一位。

所以去掉后的数就变成了, B = a*10^(k+1)  + c。A + B =( a * 11 + b ) * 10^k + 2 * c; 单个c比10^k次方小,但是2*k可能比10^k次方大,所以

2*c = n%10^k 或者 2*c = n%10^k+10^k;  a, b, c的关系就弄清楚后,我们就可以进行枚举。枚举的顺序是先对k枚举,然后对c的两种情况枚举,其次枚举b。

#include <iostream>
#include <algorithm>
using namespace std;


int main() {
	int n, x, y, a, b, c, i, j, k, tenx, idx, ans[10000];
	while( scanf("%d", &n ), n ) {
		tenx = 1;
		idx = 0;
		for( k=0; k<10; ++k ) {
			for( j=0; j<2; ++j ) {
				x = n/tenx;
				y = n%tenx;
				if( j == 1 ) {
					x --;
					y += tenx;
				}
				if( x > 0 && y % 2 == 0 ) {
					for( b=0; b<10; ++b ) {
						if( (x-b) % 11 == 0 ) {
							a = (x - b) / 11;
							int tp = (a*10+b) * tenx + y/2;
							ans[idx++] = tp;
						}
					}
				}
			}
			tenx *= 10;
		}

		sort( ans, ans+idx );
		if( idx == 0 ) {
			puts( "No solution." );
			continue;
		}
		printf( "%d", ans[0] );
		for( i=1; i<idx; ++i ) {
			if( ans[i] != ans[i-1] ) printf( " %d", ans[i] );
		}
		printf( "\n" );
	}
	return 0;
}
			


posted on 2011-03-28 20:16  CrazyAC  阅读(355)  评论(0)    收藏  举报