刚才看成文虎先生的“实用算法的分析与应用”一书中的“删数问题”,感觉先生给出的算法有错误。与大家讨论之。
先叙述一下问题:
键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原来左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出英包含所去掉的数字的位置和组成的新的正整数(N<240)
输入数据均不需判错。
输出英包含所去掉的数字的位置和组成的新的正整数(N<240)
输入数据均不需判错。
一下是我根据先生给出的算法思想写的实现:
#include
<
stdio.h
>
#include < stdlib.h >
#include < string .h >
int main( int argc, char * argv[])
... {
char big_integer[241];
int del;
scanf("%s", big_integer);
scanf("%d", &del);
while (del > 0) ...{
int i = 0;
if ( big_integer[i] < big_integer[i+1] )
++ i;
for ( int lp = i; lp < strlen(big_integer);)
big_integer[lp] = big_integer[++lp];
-- del;
}
printf("%s", big_integer);
system("pause");
return 0;
}
#include < stdlib.h >
#include < string .h >
int main( int argc, char * argv[])
... {
char big_integer[241];
int del;
scanf("%s", big_integer);
scanf("%d", &del);
while (del > 0) ...{
int i = 0;
if ( big_integer[i] < big_integer[i+1] )
++ i;
for ( int lp = i; lp < strlen(big_integer);)
big_integer[lp] = big_integer[++lp];
-- del;
}
printf("%s", big_integer);
system("pause");
return 0;
}
先生的算法只能消去局部极大数位,并且,不能保证每一趟都得到最优局部最优解。这不符合贪心法的思想。
欢迎大家和我讨论。