C语言编写:1~100共一百个自然数,放入一个99个元素的数组a[99],找出没有放入的那个元素(找出剩余数值)

本文介绍了一种使用C语言高效查找1至100数组中缺失数字的方法,通过利用高斯求和公式和伪随机数生成,实现了快速定位未包含的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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;
} 

采用伪随机数在C语言中已经是我这只菜鸡能想到的最好办法。因此在执行的时候最后剩下来的数基本都大于50。但是不管用什么语言编写,更加好的方法总能为我们解决问题提供更佳的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值