// Delete number
// 删除一个数(num)中K位后, 找出最小值
#include <stdio.h>
#define N 10 // INT 最大只有10位
int main()
{
int DeleteNumber(int n, int k);
int num = 0;
int k = 0;
printf("Input a number and k:");
scanf("%d %d", &num, &k);
num = DeleteNumber(num, k);
printf("The number is : %d\n", num);
return 0;
}
int DeleteNumber(int num, int k)
{
int GetEveryDigit(int a[N], int num); // 把数num中的各个位放入数组中, 返回数组长度
int GetMinPosition(int a[N], int len, int pos);// 从a[pos]到a[len]中寻找最小数, 返回下标
int a[N];
int pos; // 存放GetMinPosition返回值
int result = 0; // 存放结果
int len = 0; // 数组长度
if (num <= 0 || k < 0)
{
return -1;
}
else
{
len = GetEveryDigit(a, num);
pos = len;
if (len <= k) // 当要删除位数大于数组长度时, 返回0
{
return 0;
}
if (k == 0) // 不删除任何位
{
return num;
}
k = len - k; // k表示要选多少位出来,总的个数减去要删除的个数
while (k > 0) //
{
result *= 10; // 选数是从高位到低位, 所以每增加一个位, 数要*10
pos = GetMinPosition(a, pos, k); //
result += a[pos]; // 增加一位
k -- ;
}
return result;
}
}
int GetEveryDigit(int a[N], int num)
{ // 把数num中的各个位放入数组中, 返回数组长度
int n = 0;
while (num != 0)
{
a[n++] = num % 10;
num /= 10;
}
return n;
}// end
int GetMinPosition(int a[N], int len, int pos)
{ // 从a[pos]到a[len]中寻找最小数, 返回下标
int i;
int result = len-1;
for (i=len-1; i>=pos-1; i--)
{
if (a[result] > a[i])
{
result = i;
}
}
return result;
}// end
----------------解决方案--------------------------------------------------------
大家给点建议吧...
----------------解决方案--------------------------------------------------------
效率不佳
[color=white]
----------------解决方案--------------------------------------------------------
没有人做了??
[color=white]
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
O(k*(n-k)) 内完成够不
[[it] 本帖最后由 yxwsbobo 于 2008-6-5 10:15 编辑 [/it]]
----------------解决方案--------------------------------------------------------
1<=k<=n<=1e7
假如。。。n最大,k为n的一半,如何??
[color=white]
----------------解决方案--------------------------------------------------------
// 删除一个数(num)中K位后, 找出最小值
#include <stdio.h>
#define N 10 // INT 最大只有10位
int main()
{
int DeleteNumber(int n, int k);
int num = 0;
int k = 0;
printf("Input a number and k:");
scanf("%d %d", &num, &k);
num = DeleteNumber(num, k);
printf("The number is : %d\n", num);
return 0;
}
int DeleteNumber(int num, int k)
{
int GetEveryDigit(int a[N], int num); // 把数num中的各个位放入数组中, 返回数组长度
int GetMinPosition(int a[N], int len, int pos);// 从a[pos]到a[len]中寻找最小数, 返回下标
int a[N];
int pos; // 存放GetMinPosition返回值
int result = 0; // 存放结果
int len = 0; // 数组长度
if (num <= 0 || k < 0)
{
return -1;
}
else
{
len = GetEveryDigit(a, num);
pos = len;
if (len <= k) // 当要删除位数大于数组长度时, 返回0
{
return 0;
}
if (k == 0) // 不删除任何位
{
return num;
}
k = len - k; // k表示要选多少位出来,总的个数减去要删除的个数
while (k > 0) //
{
result *= 10; // 选数是从高位到低位, 所以每增加一个位, 数要*10
pos = GetMinPosition(a, pos, k); //
result += a[pos]; // 增加一位
k -- ;
}
return result;
}
}
int GetEveryDigit(int a[N], int num)
{ // 把数num中的各个位放入数组中, 返回数组长度
int n = 0;
while (num != 0)
{
a[n++] = num % 10;
num /= 10;
}
return n;
}// end
int GetMinPosition(int a[N], int len, int pos)
{ // 从a[pos]到a[len]中寻找最小数, 返回下标
int i;
int result = len-1;
for (i=len-1; i>=pos-1; i--)
{
if (a[result] > a[i])
{
result = i;
}
}
return result;
}// end
----------------解决方案--------------------------------------------------------
大家给点建议吧...
----------------解决方案--------------------------------------------------------
效率不佳
[color=white]
----------------解决方案--------------------------------------------------------
没有人做了??
[color=white]
----------------解决方案--------------------------------------------------------
回复 1# 界水乘风 的帖子
不会,标准C没有这个? ----------------解决方案--------------------------------------------------------
[bo][un]Loli[/un] 在 2008-6-4 14:27 的发言:[/bo]
没有人做了??
http://yzfy.byethost2.com/list.php
没有人做了??
http://yzfy.byethost2.com/list.php
O(k*(n-k)) 内完成够不
[[it] 本帖最后由 yxwsbobo 于 2008-6-5 10:15 编辑 [/it]]
----------------解决方案--------------------------------------------------------
1<=k<=n<=1e7
假如。。。n最大,k为n的一半,如何??
[color=white]
----------------解决方案--------------------------------------------------------