用C语言来实现1~100共一百个自然数,放入一个99个元素的数组a[99],找出没有放入的那个元素
对问题的分析
首先,按照我们常规的思路来看。我们会按部就班的按顺序将100个数依次填入数组,然后先打乱再依次去掉。或者按照无序将1-100随机选99个再填入数组,再进行一些列的操作再选出最后一个数。不管怎样看都是一件非常繁琐的事情。于是聪明的林栢濬先生就想出了一个巧妙地办法。
解决问题的思路
方法1:随机的一个个从数组取出这些数且不重复,依次计数并去掉。在100个数中随机取出99个,那么剩下的最后一个可以等同的理解为没有放入的那个元素。
方法2:直接用随机数把数组打乱,选择从头开始依次减掉或者从尾开始。这样只能选择数组的开头或者结尾来当这个随机数,但是在依次减掉这些数之前,已经用随机数打乱过了。这种方法也还可以接受。
但是这两种办法都太复杂了,我都不准备用。我要用林栢濬先生的方法:我们其实已经不难知道,学习任何一门语言的时候求1-100的累加和已经是基础练习中的基础。数学王子高斯在几百年前就把答案很快的算出来了。那么为什么不用高斯的答案来解决问题呢。我们用5050这个结果随机的减去数组里的99个数,那么最后的结果不就是这个剩下来的数了吗?
问题来了:C语言里怎么用随机数这个东西?
在C语言类库中,也可以像Java一样使用random随机数来产生随机函数。但我查过资料后发现使用random并不符合ANSI C标准。所以我们就使用rand函数来实现随机数的功能。d函数不是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子相同的数调用 rand()会导致相同的随机数序列被生成。由于不像Java和C++具有强大的类库,只能用伪随机数来实现。
程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main()
{
int arr1[99]; //数组的容量为100
int i;
for(i=1;i<=100;i++)
arr1[i-1]=i+1; //将1-100依次填入数组arr1
int j=10; //设置好取模的数
int m,n,change=1000,temp;
srand(unsigned(time(NULL)));
while(change--) //对数组里面的数进行随机交换
{
m=rand()%j;
n=rand()%j;
temp=arr1[m];
arr1[m]=arr1[n];
arr1[n]=temp;
}
int arr2[98]; //设置第二个数组,数组长度为98时会自动省去一个arr1中的数字,且这个数字也是被随机排序过的
int o;
for(o=0;o<98;o++)
arr2[o]=arr1[o];
int gause=5050; //采用高斯公式的结果来进行运算
int k;
for(k=0;k<99;k++)
gause=gause-arr2[k];
return gause;
}