去掉数字里面一位数的问题
看了别人的解题报告,再次对自己数学能力表示悲哀~~~~~~
对于这种问题,我们通常可以把这个数表示成这样: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;
}
浙公网安备 33010602011771号