1-N个数随机去掉两个数,遍历一次把这两个数找出来

10 篇文章 0 订阅

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

 学习算法,把一些简单的问题写一写,做一做

 

【题目】:1- n这n个数随机减少两个数后,放在A[]中(打乱顺序),以时间复杂度为O(n)的算法找到减少的这2个数

【思路】如果是减少1个数,那么大家都知道方法——循环一次,求A[]的和sum以及(1+2+...+n)=SUM,然后用SUM-sum就能得到结果。可是,现在出现2个数,那么导致只求和是不行的,那么请问能怎么办?那就通过别的运算记录更多的信息!四则运算有加减乘除吗?别老是记着+,把别的兄弟都给忘了!

#include "stdafx.h"
#include<iostream>
#include<cmath>
using namespace std;
// 1 --- n个数随机减少两个,放在A[]中,
// 以时间复杂度为O(n)的算法找到他们
// 这存在一个问题,当n到大一定程度的时候,sum和mul要越界
void FindTwoLostNum(int A[],int n,int &num1,int &num2);
int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	int num1 = 0;
	int num2 = 0;
	int A[100];
	cout<<"input the value of n(<100)"<<endl;
	cin>>n;
	cout<<"input A[]"<<endl;
	for(int k=0;k<n;++k)
	{
		cin>>A[k];
	}
	FindTwoLostNum(A,n,num1,num2);
	cout<<"the two lost numbers are:\n"<<num1<<"\t"<<num2<<endl;
	return 0;
}


void FindTwoLostNum(int A[],int n,int &num1,int &num2)
{
	int sum = 0;
	int mul = 1;
	for(int i=1;i<=n;++i)
	{
		sum += i;
		mul *= i;
		//sum2 += i*i;
	}
	for(int j=0;j<n-2;++j)
	{
		sum -= A[j];
		mul /= A[j];
		//sum2 -= A[j]*A[j];
	}
	//此时得到2根之和为sum,2根之积为mul,根据求根公式可以解
	num1 = (sum-(int)(sqrt(double(sum*sum-4*mul))))/2;
	num2 = (sum+(int)(sqrt(double(sum*sum-4*mul))))/2;
}

 

【注释】: 更好一点的方法是求第二个关键值sum2的时候,换成注释部分,然后再根据方程组:x+y=sum, x*x+y*y=sum2,可以相应求出x*y,后面的求解步骤类似。

 

欢迎前往个人博客 驽马点滴 和视频空间 哔哩哔哩-《挨踢日志》

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是回复: 首先,根据用户输入的 m 作为随机数种子,可以使用 Python 中的 random 模块生成 n 个 -9 之间的随机整数,并将它们以字符形式加入列表中。 接下来,可以先输出原始的列表,然后使用 Python 中的 set() 函数去除重复元素,再将去重后的列表按升序排序,最后输出排序后的列表即可。 以下是示例代码: ```python import random # 获取用户输入的 m 和 n m = int(input("请输入随机数种子 m:")) n = int(input("请输入要生成的随机整数个数 n:")) # 设置随机数种子 random.seed(m) # 生成 n 个 -9 之间的随机整数,并将它们以字符形式加入列表中 num_list = [str(random.randint(, 9)) for i in range(n)] # 输出原始的列表 print("原始列表:", num_list) # 去除重复元素并按升序排序 sorted_list = sorted(list(set(num_list))) # 输出排序后的列表 print("去重排序后的列表:", sorted_list) ``` 希望能对您有所帮助! ### 回答2: 首先,根据用户输入的随机数种子m,可以通过随机数生成器产生n个0-9之间的整数,并将这些数字以字符形式加入列表中。使用随机数生成器可以尽可能地避免生成重复的数字,但仍需对列表进行去重操作。 接着,需要先输出原列表中的元素。可以使用for循环遍历列表,逐个输出每个元素。输出后,可以使用set()函数对列表进行去重操作,将原列表转化为一个不含重复元素的集合。 最后,需要将集合转化为升序排序后的列表,并进行输出。可以使用sorted()函数对集合进行排序,并将排序后的结果转化为列表形式。使用for循环遍历新列表的每个元素,逐个输出,并在元素之间添加空格,以使输出更加整齐。 完整代码实现如下: ``` python import random m = int(input('请输入随机数种子m:')) n = int(input('请输入要生成的数字个数n:')) # 生成列表 random.seed(m) numbers = [str(random.randint(0, 9)) for i in range(n)] # 输出原列表 print('原列表:') for num in numbers: print(num, end=' ') print() # 去除重复元素 numbers = list(set(numbers)) # 排序后输出 print('去重后的升序列表:') numbers = sorted(numbers) for num in numbers: print(num, end=' ') print() ``` 在使用时,输入随机数种子和生成数字个数,程序即可自动生成数字列表并输出。 ### 回答3: 在Python中,可以使用random和列表生成式来生成随机数列表。具体步骤如下: 首先,导入random模块: ```python import random ``` 然后,接收用户输入的个参数m和n: ```python m = int(input("请输入随机数种子m: ")) n = int(input("请输入需要随机生成的整数数量n: ")) ``` 接下来,使用random模块生成n个0-9之间的随机整数: ```python random.seed(m) # 设置随机数种子 lst = [random.randint(0, 9) for _ in range(n)] # 生成随机数列表 print("随机数列表:", lst) ``` 接着,使用set()函数去除重复元素,再将去重后的列表排序: ```python lst = list(set(lst)) # 去除重复元素 lst.sort() # 排序 print("排序后的列表:", lst) ``` 最终的完整代码如下: ```python import random m = int(input("请输入随机数种子m: ")) n = int(input("请输入需要随机生成的整数数量n: ")) random.seed(m) # 设置随机数种子 lst = [random.randint(0, 9) for _ in range(n)] # 生成随机数列表 print("随机数列表:", lst) lst = list(set(lst)) # 去除重复元素 lst.sort() # 排序 print("排序后的列表:", lst) ``` 运行示例: ``` 请输入随机数种子m: 3 请输入需要随机生成的整数数量n: 10 随机数列表: [1, 8, 1, 4, 7, 5, 6, 7, 7, 1] 排序后的列表: [1, 4, 5, 6, 7, 8] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值