本帖最后由 大虾挂了 于 2013-10-11 15:48 编辑
我的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 判断是不是重复数
{
class Program
{
//该字段的意义:
//temp[0]:
//初始赋值为:输入数字+1(因为后面chuli()函数运作时第一个数字是可取的,而题干要求大于输入数字)
//中间过程用于存储:从高位开始判断数字出现相邻重复现象时,重复数字(包括重复的2个)左边所有数字组成的数字
//最终:当给定数字已经完全处理完毕时的数字。
//temp[1];
//初值为0,
//中间过程用于存储:从高位开始判断数字出现相邻重复现象时,重复数字(不包括重复的2个)右边一共有多少位数字 //最终用于表示给定数字处理完后,temp[0]这个数字还差多少位。
//temp[2]:用于记录chuli()函数是否检测到重复数字,0表示未检测到(处理完成),1表示检测到(处理未完成)
public static int[] temp=new int[3];
//用复杂例子说明这个算法的工作原理:
//用户输入989898。
//程序先将这个数加一,也就是从989899开始判断。
//进入do-while循环
//chuli()函数第一次运行,temp数组变为{989899,0,1}(原始temp[2]为0)
//由于检测到最后两个9相邻,所以表示处理未完成,temp[0]要自加1,变为989900。
//循环继续运行,第二次运行chuli()函数,temp数组变为{9899,2,1}
//temp[0]继续自加1,变为9900
//循环继续运行,第三次运行chuli()函数,temp数组变为{99,4,1}
//temp[0]继续自加1,变为100
//循环继续运行,第四次运行chuli()函数,temp数组变为{100,4,1}
//temp[0]继续自加1,变为101
//循环继续运行,第五次运行chuli()函数,无法检测到相邻的数
//temp数组最终变为{101,4,0},数组前两个数字是关键数字,
//最终字符串是temp[0]+"0"+"1"+"0"+"1"。
//后面的"0""1"部分只要建立一个循环,参数i初值为0,次数为temp[1],不断让字符串自加i%2即可
static void Main(string[] args)
{
string num = "";
Console.WriteLine("请输入一个数,我们将输出比这个数大的最小非重复数");
temp[0]=Convert.ToInt32(Console.ReadLine ())+1;
do
{
chuli();
if(temp[2]==0)
break;
else
temp[0]++;
}while(true);
num = temp[0].ToString();
for (int i = 0; i < temp[1]; i++)
{
num += i % 2;
}
Console.WriteLine(num);
Console.ReadKey();
}
//这个方法的作用:
//对temp[0]这个数字进行处理,从高位检测,当遇到重复数字时,截取包括重复数字在内的左边所有数字
//对于那些没有被截取到的数字,我们把它们一共的位数加到temp[1]中去
//temp[2]表示是否检测到重复数字,0表示未检测到重复数字,1表示检测到重复数字
//举例,当temp数字本身为{1234554321,0,0}时,运行chuli()函数,我们会截取123455给temp[0]
//并且算不出后面还有四位数字,temp[1]自加4,检测到重复数字了,所以temp[2]赋值为1
//这样temp数组就变为{123455,4,1}
public static void chuli()
{
int i=0;
for (i = 0; i < temp[0].ToString().Length - 1; i++)
{
if (temp[0].ToString() == temp[0].ToString()[i + 1])
break;
}
if (i == temp[0].ToString().Length - 1)//此时表示num[0[本身就是一个无重复数字,无需处理
temp[2] = 0;
if (i < temp[0].ToString().Length - 1)//此时表示num[0]是个有相邻重复数字的数
{
temp[2] = 1;
//注意下面不要把顺序写反num[0]的位数应该先用于计算num[1],再对num[0]进行截取
temp[1] += temp[0].ToString().Length - 2 - i;
temp[0] = Convert.ToInt32(temp[0].ToString().Substring(0, i + 2));
}
}
}
}
|