主题:一个C#的简单题目.
zjsky830
[专家分:0] 发布于 2007-07-04 23:18:00
给出一个不大于1 000 000的数a。每次操作,你可以将当前的数中的两个非零位交换位置,并都减去1,得到一个新的数。比如155,我们将百位和个位进行操作,就得到了450.请你的程序输出经过任意次上述的操作,a最大能变成什么数。最好运行的速度不超过1秒。
题目不是很难,因为是初学者,想请教下高手如何来写这个程序,谢谢!!
回复列表 (共13个回复)
11 楼
moonblade [专家分:120] 发布于 2007-07-22 15:48:00
我的看法:
1:如果这个数原来是89,那干脆不要换,一换准赔,等于87。
===>如果高位数字仅比要换的低位数字小1,那么不要换,因为会赔本
2:如果这个数原来是188,那么用1换个位的8比换十位的8赚得多。
===>如果两个处于不同位的数字一样大,那么优先换掉低位的
3:数字大的数肯定要往前跑,往个位跑准赔。要是前边没有合适的地方那肯定不会有数字和它交换位置。
基于以上几点,我的思路如下:
1:先把这个数放到数组中因为数不超过6位,那么我们准备一个int num[6]来存放。num[0]是最高位,num[5]是最低位即个位。没有的数位用0来填充。如100就是000100。
2:从最高位开始扫描这个数组,找到最大的那个数字,记录下它的下标。如果最大的数存在好几个,那么记录下标大的那一个。找到的下标记作int i。
3:设int x=num[i]-1,然后从下标0开始搜索,到下标i-1结束。如果被访问的元素比x小而且不是0,那就交换,并且将和x交换的那个数字-1。如果没有合适位置,那么就不动。
4:此时,最高位肯定已经找到了最合适的数字。将次高位设成当前的最高位,重复过程2-4,直到当前最高位是个位时结束程序。
5:此时得到的就是最大的数字。
12 楼
↘①頭o亂髪 [专家分:0] 发布于 2008-11-02 19:44:00
我觉得用字符串操作比较好点,它可以直接调用函数,哪个交换,只要那样比较容易,然后再转换一下,就好了,只是我的大概想法
13 楼
↘①頭o亂髪 [专家分:0] 发布于 2008-11-02 20:23:00
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个整数:");
int intNumber =Convert.ToInt32(Console.ReadLine());
string strTemp = intNumber.ToString();
Console.WriteLine("请输入你要将哪位交换(输入的整数>=0):");
int i = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请次输入你要交换的另一位(输入的整数>=0):");
int j = Convert.ToInt32(Console.ReadLine());
char ch0,ch1;
ch0 = strTemp[strTemp.Length - i-1];
ch1 = strTemp[strTemp.Length - j-1];
string str = "";
for (int k = 0; k < strTemp.Length; k++)
{
if (i == (strTemp.Length - k-1))
{
str += ch1;
continue;
}
else if (j == (strTemp.Length - k-1))
{
str += ch0;
continue;
}
else
{
str += strTemp[k];
}
}
intNumber = Convert.ToInt32(str) - 1;
Console.WriteLine("操作后的结果为:{0}", intNumber);
Console.ReadKey();
}
}
}
我来回复