| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3602 人关注过本帖
标题:删除数字问题(不会)
只看楼主 加入收藏
xikang
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-4-21
收藏
 问题点数:0 回复次数:18 
删除数字问题(不会)
老师布置了一个问题,要个c语言程序,问题是这样。
输入一个大数字(例如:4521689),再输入一个小点的数字(例如:4)。在这个4521689中删除4个数字,使得留下的数字最小,本题的话,结果应该为:168
再如:65192264 输入4
得到:1224
关于0的问题,他没有提到,比如563012 输入3,应该得到012呢还是301。这个问题我不清楚,所以也一直不会做。
搜索更多相关主题的帖子: 数字 删除 c语言 本题 小点 
2006-05-11 18:40
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
查阅<数据结构>类书籍,学习一下"贪心法"可望解决问题

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-11 19:11
xikang
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-4-21
收藏
得分:0 

删数问题

键盘输入一个高精度的正整数N(此整数中没有‘0’),去掉其中任意s个数字后,剩下的数字按从左到右次序将组成一个新的正整数.编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小.

输入 n,s

输出 输出删数后的正整数.

【输入】

n

s

【输出】

最后剩下的最小数。

【样例输入】

175438

4

【样例输出】

13

这个是老师布置的原题目。我写了一个,但是有问题。谁帮俺改改,谢谢了!
#include <stdio.h>
#include <string.h>
#define M 10
main()
{int i,j,t=0,m,n;
char *p;
char b[M];
printf("input a string:");
gets(b);
m=strlen(b);
printf("input a data n=");
scanf("%d",&n);
if(m<=n)printf("error");
else
{p=b;
for(i=0;i<m-n;i++)
{if(*p>=*(p+1))
{for(j=0;j<m-i-1;j++)
{*p=*(p+1);
p++;
}
*p=0;
p=b;
t++;
if(t==n)break;}
else p++;}
p=b;}
for(i=0;i<m-n;i++,p++)
printf("%d",*p);
getch();
}


2006-05-12 19:15
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
这种题还是很简单的,你自己慢慢看吧,
你的程序看得我晕晕的,没必要弄那么复杂吧?
1。先输入一个n位数,用数组来接收,每位存一次;
2。输入你要减去的位数m;
3。从这个n位数的数组中依次寻找出最大的数(循环n-m次,找出后,这个数不再计算),依次从小到到排列成新数组a[n-m];
4。输出a[n-m]就是了。

刚才没说明白,重新编辑了下。

[此贴子已经被作者于2006-5-12 19:30:25编辑过]


对不礼貌的女生收钱......
2006-05-12 19:28
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
楼主说的好象不用字符串吧

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-12 20:24
xikang
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-4-21
收藏
得分:0 
#include <stdio.h>
#include <string.h>
#define M 10
main()
{int i,j,t=0,m,n;
char *p;
char b[M];
printf("input a string:");
gets(b);
m=strlen(b);
printf("input a data n=");
scanf("%d",&n);
if(m<=n)printf("error");
else
{p=b;
for(i=0;i<m-n;i++)
{if(*p>=*(p+1)) /*比较前两位大小*/
{for(j=0;j<m-i-1;j++) /*for循环目的,要是第一个大于第二个,则把第一个数后面的数依次赋给前面的,从而覆盖了第一个大数*/
{*p=*(p+1);
p++;
}
*p=0; /*给最后一个位置赋0*/
p=b;/*指针回到前面,重新开始。*/
t++;
if(t==n)break;}
else p++;}
p=b;}
for(i=0;i<m-n;i++,p++) /*做完以上程序之后,现在想要的几个数肯定在数组前面,而后面全是0,然后我就打印出想要的几个就行。*/
printf("%d",*p);
getch();
}


上面就是我的思想,其实用数组来做我也会,就像4楼的办法,不过我就想用一下指针。
我的思想说明白了,那位兄弟能按照这个思想做一个程序吗? 谢谢

2006-05-13 08:53
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
您没把问题解释清楚,您这程序的意思是这个数的各个位的数字在删除几个数字后相对顺序保持不变,对吧?比如43521,输入n=3之后,得到的数应该是21而不是12,对吧?

对不礼貌的女生收钱......
2006-05-13 09:45
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#include <stdio.h>
#define M 10
int main()
{
int m,n,i,j,counter=0;
char str[M];
char *p;
puts("enter the number:");
gets(str);
m=strlen(str);
puts("enter another number:");
do
{
scanf("%d",&n);
if(m<=n)
puts("wrong input! enter again!");
}while(m<=n);
p=str;
while(1)
{
for(i=0;p[i]!='\0';i++)
{
if(p[i]>p[i+1])
{
for(j=i;j<m;j++)
p[j]=p[j+1];
counter++;
if(counter==n)
goto exit;
break;
}
}
}
exit:
puts(str);
getch();
}
如果上述的意思是对的,那么这个程序是你想要的.

检查到一个毛病,重新编辑了下.

[此贴子已经被作者于2006-5-13 11:46:35编辑过]


对不礼貌的女生收钱......
2006-05-13 09:47
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 
要删就直接从LONG型数据中删除,这样才能有进步,直接从字符串中删除没意思

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-13 10:56
luo113927
Rank: 1
等 级:新手上路
帖 子:173
专家分:0
注 册:2006-3-15
收藏
得分:0 
偶看可以按这个步骤来解决,首先将数存如数组,例输入 65192264 4
[65192][2][6][4]
|
{1}比较出最小,后留有92264

再分即[922][6][4]
|
{2}剩余264
又[26][4]
|
{2}剩余64
又[64]
|
{4}
结果1224
2006-05-13 10:57
快速回复:删除数字问题(不会)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024099 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved