| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1139 人关注过本帖
标题:[求助]我有一道关于数字的编程题
只看楼主 加入收藏
oujifei
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-7-7
收藏
 问题点数:0 回复次数:17 
[求助]我有一道关于数字的编程题

给出一个不大于1 000 000的数a。每次操作,你可以将当前的数中的两个非零位交换位置,并都减去1,得到一个新的数。比如155,我们将百位和个位进行操作,就得到了450.请你的程序输出经过任意次上述的操作,a最大能变成什么数。最好运行的速度不超过1秒。请用c++或者c#写


因为是初学者,想请教下高手如何来写这个程序,谢谢!!

搜索更多相关主题的帖子: 数字 
2007-07-07 14:23
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 

他叫你变多少次 你就变多少次就行了
每次变的时候查找数字最大的与最高位交换,若有两个数字同时最大,取位低的与最高位交换。


天行健,君子以自强不息!!QQ:68660681
2007-07-07 14:33
caichengpei
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-7
收藏
得分:0 

偶是菜鸟,不知道怎么做,只弄了个3位数,把个位跟百位交换并都减1的东东,惭愧的很.
////////////////////////
#include "math.h"
void action(int x)
{
int first_num,second_num,third_num,answer;
first_num=x/100;
second_num=(x-first_num*100)/10;
third_num=x-first_num*100-second_num*10;
/* printf("\n%d,%d,%d",first_num,second_num,third_num); */
answer=(third_num-1)*100+second_num*10+(first_num-1);
printf("\n%d",answer);

}
main()
{
int a;
printf("\nplese input one number:");
scanf("%d",&a);
if(a>=100&&a<=999)
{
printf("\nThe number you enter is:%d",a);
action(a);
}
else
{
printf("\nThe number you enter is wrong!");
}
}
////////////////////////////

2007-07-07 15:02
酒肉弥勒佛
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:399
专家分:0
注 册:2006-6-6
收藏
得分:0 
889
怎么换?怎么换都比889小,这种情况怎么办呢

编程是为了提高效率,好的程序是因为他的高效;在编程的道路上,永远追逐高效的算法
2007-07-07 15:30
caichengpei
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-7
收藏
得分:0 

改了一下,可以进行3位数的操作,找出三位中最大的数跟最高位交换,并分别减一,菜鸟,刚学C,大家见笑了.
///////////////////////////////
#include "math.h"
int max(int x,int y,int z)
{
int answer;
if(y>x)
{
answer=(y-1)*100+(x-1)*10+z;
}
else if(z>x)
{
answer=(z-1)*100+y*10+(x-1);
}
else answer=x*100+y*10+z;

return answer;

}
void action(int x)
{
int first_num,second_num,third_num,answer_num;
first_num=x/100;
second_num=(x-first_num*100)/10;
third_num=x-first_num*100-second_num*10;
answer_num=max(first_num,second_num,third_num);
if(answer_num>x)
{
x=answer_num;
first_num=x/100;
second_num=(x-first_num*100)/10;
third_num=x-first_num*100-second_num*10;
answer_num=max(first_num,second_num,third_num);
}
│ printf("\n%d",x);


│}
│main()
│{
│ int a;
│ printf("\nplese input one number:");
│ scanf("%d",&a);
│ if(a>=100&&a<=999)
│ {
│ printf("\nThe number you enter is:%d",a);
│ action(a);
│ }
│ else
│ {
│ printf("\nThe number you enter is wrong!");
│ }
 }

2007-07-07 15:40
caichengpei
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-7-7
收藏
得分:0 
以下是引用酒肉弥勒佛在2007-7-7 15:30:36的发言:
889
怎么换?怎么换都比889小,这种情况怎么办呢

那就证明已经是最大了呀,结束就行了.

2007-07-07 15:43
酒肉弥勒佛
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:399
专家分:0
注 册:2006-6-6
收藏
得分:0 
能不能把你代码重新贴下阿

编程是为了提高效率,好的程序是因为他的高效;在编程的道路上,永远追逐高效的算法
2007-07-07 15:57
酒肉弥勒佛
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:399
专家分:0
注 册:2006-6-6
收藏
得分:0 
找出三位中最大的数跟最高位交换,并分别减一

这样的算法好像有问题,879,用这个算法得到877,但是我用后两位交换得到886

编程是为了提高效率,好的程序是因为他的高效;在编程的道路上,永远追逐高效的算法
2007-07-07 16:00
酒肉弥勒佛
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:399
专家分:0
注 册:2006-6-6
收藏
得分:0 
这个算法我试了下,小于1s,可以得到最到数,但不知道有没有潜在错误
我是先用最大的数-1,在从高位向低位找位置替换

int main()
{
char num[8],c,temp[2];
int count=0,max=0,s=0,i;


while(1)
{
c=getchar();
if((c=='\n') || (count>6))
break;

num[count]=c;

temp[0]=c;
temp[1]='\0';
if(atoi(temp)>=max)
{
max=atoi(temp);
s=count;
}

count++;
}

num[count]='\0';

printf("num:%s\n",num);

for(i=0;i<count;i++)
{
if((num[s]-1)>num[i])
{
c=num[i];
num[i]=(num[s]-1);
num[s]=(c-1);
break;
}
}


printf("new num:%s\n",num);
}

编程是为了提高效率,好的程序是因为他的高效;在编程的道路上,永远追逐高效的算法
2007-07-07 17:13
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
恩。。是我当时考虑不周

天行健,君子以自强不息!!QQ:68660681
2007-07-07 17:23
快速回复:[求助]我有一道关于数字的编程题
数据加载中...
 
   



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

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