- 论坛徽章:
- 0
|
假设题目描述的b对正整数a的关系可以表示为函数b=foo(a);
引理1:foo(X[j]*10^j)
= 1*10^(j+1) + (X[j]-1)
其中X[j]!=0,j=0,1,2,... (待证明)
例如:
foo(1) = 10;
foo(20) = 101;
foo(300) = 1002;
引理2:foo(X[N]*10^N + ... + X[j+1]*10^(j+1) + X[j]*10^j)
= X[N]*10^N + ... + X[j+1]*10^(j+1) + 1*10^(j+1) +(X[j]-1)
其中X[N]!=0,X[j+1]!=9,X[j]!=0,j=0,1,2,... (待证明)
例如:
foo(951) = 960;
foo(8620) = 8701;
foo(57300) = 58002;
引理3:foo(X[N]*10^N + ... + X[i+1]*10^(i+1) + X*10^i + ... + X[j+1]*10^(j+1) + X[j]*10^j)
= X[N]*10^N + ... + X[i+1]*10^(i+1) +1*10^(i+1) + (X[j]-1)*10^(i-j) + X*10^(i-j-1) + ... + X[j+1]*10^0
其中X[N]!=0,X[j]!=0,X[j+1]直到X == 9, i,j=0,1,2,... (待证明)
例如:
foo(1591) = 1609;
foo(169920) = 170199;
foo(17999300) = 18002999;
一个正整数a肯定可以表示成
a = X[N]*10^N + ... + X[i+1]*10^(i+1) + X*10^i + ... + X[j+1]*10^(j+1) + X[j]*10^j
的形式
根据引理3就可以解
如果程序来实现,只要分解出a的每一十进制位的值即可。
关于引理证明问题,我觉得引理看起来很自然,一时想不到简单明了方法证明之。
请诸位高手指点
如果a是负数,研究中……
-----
#include <stdio.h>
unsigned int power(unsigned int base, unsigned int n)
{
unsigned int val;
val = 1;
while(n--)
{
val *= base;
}
return val;
}
unsigned int fill_digit(unsigned int digit,
unsigned int *digitArray)
{
int i;
i = 0;
do
{
digitArray = digit%10;
digit /= 10;
i++;
}while(digit);
return i;
}
unsigned int foo(unsigned int a)
{
unsigned int digitArray[20];
unsigned int digitWidth;
unsigned int b;
unsigned int i;
unsigned int j;
unsigned int idx;
digitWidth = fill_digit(a, digitArray);
for(idx=0; idx<digitWidth; idx++)
{
if(0 != digitArray[idx])
{
j = idx;
i = idx;
break;
}
}
idx++;
if(idx<digitWidth)
{
if(9 == digitArray[idx])
{
for(; idx<digitWidth; idx++)
{
if(9 == digitArray[idx])
{
i = idx;
}
else
{
break;
}
}
}
}
b = 0;
for(idx=digitWidth-1; idx>=0; idx--)
{
if(idx>i)
{
b += digitArray[idx]*power(10, idx);
continue;
}
if(idx>j)
{
b += 9*power(10, idx-j-1);
continue;
}
break;
}
b += power(10, i+1) + (digitArray[j]-1)*power(10, i-j);
return b;
}
int main(int argc, char *argv[])
{
unsigned int a;
if(argc > 1)
{
a = atoi(argv[1]);
if(a)
{
printf("%d -- %d\n", a, foo(a));
}
}
return 0;
}
-----
[ 本帖最后由 sanbiangongzi 于 2007-10-27 08:23 编辑 ] |
|