背景是来自博问,就趁手写了写代码,是实话有点紧张了,毕竟是有人看的,急于回复,言语有些不严谨,图还画错了一个地方,程序的初始值是0,人为习惯写成了1,反反复复回复了一遍,被反对了一下,原本是支持的....
所以对自己刚刚的表现不是很满意,于是又优化了一下重新回答了那个人,并得到了青睐,算我自作多情吧,也许别人只是借鉴了下思路,废话不多说,上code!
static void Main(string[] args) { List<int> resultList = new List<int>(); int curr = 100; Random ir = new Random(); int index = ir.Next(1,10); List<int> list = new List<int>(); for (int i = 0; i < index; i++) { Random r = new Random(); int v = r.Next(100); do { v = r.Next(100); } while (list.Contains(v)); list.Add(v); } list.Sort(); Console.WriteLine(curr-list[list.Count-1]); for (int i = list.Count-1; i >=1; i--) { Console.WriteLine(list[i] - list[i-1]); } Console.WriteLine(list[0]-0); }
resultList是结果集合,为了输出具体数字就没多事存集合了,真正用到的时候会存到集合里
int index = ir.Next(1,10);//毕竟个数不能写死,这样就不好玩了,回答别人博问的最后答案没有这个,是写死的,不过她应该自己能改过来吧,我对自己不满意也就没脸继续去回复了~
do { v = r.Next(100); } while (list.Contains(v));//随机会存在重复的问题,因此做个do-while处理一下,呵呵,记得今年在某个地方写代码这里还出现过死循环,这样一说这里还是有死循环漏洞的,应该加个循环次数限制,万一真的达到某个条件就一直循环呢,那就尴尬大了
list.Sort();//线段之间的点是需要按顺序来的,可惜不能倒叙,不然下面的for也不必i--了,说实话i--反着来还是第一次,挺不习惯
Console.WriteLine(curr-list[list.Count-1]); for (int i = list.Count-1; i >=1; i--) { Console.WriteLine(list[i] - list[i-1]); } Console.WriteLine(list[0]-0);//输出头尾的代码看着很不雅观,没办法, 要想在一个for里输出估计又要加逻辑,何必呢,简单来,不雅观的地方封装成方法折叠嘛。
--------------------------------------------------------------
上面是图,下面是博问截取的内容,错误的地方修饰了一下
--------------------------------------------------------------
设数字为N,和的范围为1-N。
1-N之间是若干节点(位置),假设为a,b,c。
线的长度是N,N的长度=各个线段的和
也就是N=(n-c)+(c-b)+(b-a)+(a-0);
SO,可以得出n-c、c-b、b-a、a-0就是你要的数。
同理,可以根据自己的需要改成a...n-1个节点
--------------------------------------------------------------
怎么说呢,算是一次经验和教训吧,希望自己以后再回答别人问题时不要急于求成,写好了Demo再给人家,减少别人的问题,当然授人以鱼不如授人以渔,思路也很重要,给思路是给别人的,给源码其实除了方便别人,也是对自己的锻炼吧,有些东西只是想一想不写出来,和亲自去实践一下,还是有很大区别的。
就不发首页了,指不定被踢下来,不过说实话这种经历还是想让更多人看到的,毕竟有问题也能一起交流交流,算了,家丑不外扬,自己知道就好,嗯,挺好的,就这样!
续:输出的值之间差不能太大,所以重新写了
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
static void Main(string[] args) { Random random = new Random(); var intList = new List<int>(); int mutil = 100; int du = 10; do { int index = random.Next(1, du); if (index > 0) { intList.Add(index); } } while (!(intList.Sum() >= mutil - du)); intList.Add(mutil - intList.Sum()); foreach (var item in intList) { Console.WriteLine(item); } Console.WriteLine("集合值:"+intList.Sum()); }
每次添加10以内的值,在最后一次“可能” 添加满的时候停止循环,然后根据总数做减法得出最后一个值。