精华内容
下载资源
问答
  • 有序

    2019-07-29 22:37:34
    这是一次考试的题目(210/400)考的不太好吧(反正我是这么想...有序数(number.cpp) 【问题描述】 将自然数1-n按以下规律排列:(n<2147483647) 第一列 第二列 第三列 第四列 第五列 … 第一行 1 4 5 16...

    这是一次考试的题目(210/400)考的不太好吧(反正我是这么想)
    以下内容对于dalao而言可能很简单所以dalao请回 (不是)
    不说废话了上题:
    有序数对(number.cpp)
    【问题描述】
    将自然数1-n按以下规律排列:(n<2147483647)

    第一列 第二列 第三列 第四列 第五列
    第一行 1 4 5 16 17
    第二行 2 3 6 15
    第三行 9 8 7 14
    第四行 10 11 12 13
    第五行

    表示数2在第二行第一列,与有序数对(2,1)对应,数5与(1,3)对应,数14与(3,4)对应,请根据这一规律,写一个程序,每输入一个整数N,输出其对应的有序数对。
    【输入文件】
    第一行为一个整数N (1<=N<=10000)。
    【输出文件】
    输出N对应的有序数对。
    【输入样例】
    5
    【输出样例】
    (1,3)

    我第一反应想到的是模拟,把数字都写下来再来找,后来发现有种更高级 的方法(考试的时候我是没写出来…现在想想自己为什么这么蠢)
    以下是我所说的更高级 的方法(可能对于我是这样)

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
    	int n;
    	cin>>n;
    	int a=sqrt(n);
    	int b=a*a;
    	int t=n-b;
    	if(t==0)
    	{
    		if(a%2!=0)cout<<"("<<a<<",1)";
    		else cout<<"(1,"<<a<<")";
    	}
    	else 
    	{
    		if(a%2==0)
    		{
    			if(t<=a)cout<<"("<<t<<","<<a+1<<")";
    			else cout<<"("<<a+1<<","<<2*(a+1)-t<<")";
    		}
    		else 
    		{
    			if(t<=a)cout<<"("<<a+1<<","<<t<<")";
    			else cout<<"("<<2*(a+1)-t<<","<<a+1<<")";
    		}
    	}
    	return 0;
    }
    

    这种方法更要求数学素养(像我这种数学不好的考试怎么会想得到嘤)
    没有注释好像不怎么好理解
    所以接下来是模拟然后枚举的方法啦

    #include<iostream>
    using namespace std;
    int a[200][200];
    int main()
    {
    	int n,vt=5,i,j,h,k;
    	cin>>n;
    	a[1][1]=1;a[2][1]=2;a[2][2]=3;a[1][2]=4;
    	for(i=3;vt<=n;i++)
    	{
    		for(j=1;j<=i&&vt<=n;j++)
    		{
    			a[j][i]=vt++;
    			h=j;k=i;
    		}
    		for(j=i-1;j>=1&&vt<=n;j--)
    		{
    			a[i][j]=vt++;
    			h=i;k=j;
    		}
    		i++;
    		for(j=1;j<=i&&vt<=n;j++)
    		{
    			a[i][j]=vt++;
    			h=i;k=j;
    		}
    		for(j=i-1;j>=1&&vt<=n;j--)
    		{
    			a[j][i]=vt++;
    			h=j;k=i;
    		}
    	}
    	if(n==1)cout<<"(1,1)";
    	else if(n==2)cout<<"("<<2<<","<<1<<")";
    	else if(n==3)cout<<"("<<2<<","<<2<<")";
    	else if(n==4)cout<<"("<<1<<","<<2<<")";
    	else cout<<"("<<h<<","<<k<<")";
    	return 0;
    } 
    

    模拟的方法相对而言会更容易想到但是好长…
    所以还是推荐一下第一种更不容易想到的方法啦,只要数学思维理解到了就并不难
    我学信息学是为了在代码中给你一片天地(这是一句不正经的题外话)

    展开全文
  • 将一个正整数表示为连续自然数的和 ...题目中的连续自然数序列可以看做一个升序的有序数组,取数组前两个数为起始的区间的左右两个端点。区间中的值进行累加,如果累加值小于给定...

    原文:将一个正整数表示为连续自然数的和

      将一个正整数表示为连续自然数的和,比如给定整数15,那么根据题意,需要输出的连续自然数为1+2+3+4+5=4+5+6=7+8=15。题目中的连续自然数序列可以看做一个升序的有序数组,取数组前两个数为起始的区间的左右两个端点。对区间中的值进行累加,如果累加值小于给定的整数时,那么右端点向右移动,添加下一个数字,如果累加值大于给定的整数时,那么左端点向右移动,表示去掉最左端的最小值,如果值与给定整数相等,那么输出后,需要重新对定区间左右两个端点赋值,直到左端点的值小于 (number+1)/2。代码如下:

     1 void printContinuous(int begin, int end, int value)
     2 {
     3     for(int i=begin; i!=end; i++)
     4         cout<<i<<"+";
     5     cout<<end<<" = "<<value<<endl;
     6 }
     7 
     8 void findContinuous(int n)
     9 {
    10     int begin=1, end = 2;   //begin和end分别代表和为n的连续正数的区间
    11     int middle = (n+1)/2;   //middle表示n的中间数,middle*2 >= n,所以控制begin<middle即可
    12     int sum = begin+end;
    13 
    14     while(begin < middle)
    15     {
    16         if(sum == n)    //和与n相等,则打印
    17         {
    18             printContinuous(begin, end, n);
    19             //从begin+1开始重新计算sum的值
    20             begin++;
    21             end = begin+1;
    22             sum = begin+end;
    23         }
    24         else if(sum > n)//如果sum>n,那么begin右移,即减去最左边的数
    25         {
    26             sum-=begin;
    27             begin++;
    28         }
    29         else//如果sum<n,那么end右移,即添加一个数
    30         {
    31             end++;
    32             sum+=end;
    33         }
    34     }
    35 }

      上面的解法可以满足题目的要求,我们现在试着用数学的方法来求解此题。题目中要求将给定整数表示为连续自然数的和,而连续自然数序列可以看做一个等差数列,那么题目可以重新描述为,求出和为给定整数值的自然数组成的等差数列。等差数列前n项和的公式为:a1*n+ n*(n-1)*d/2,其中a1表示首项值,n表示项数,d表示公差。根据公式,可以写出代码:

     1 void findContinuous2(int n)
     2 {
     3     for(int i=1; i<(n+1)/2; i++)
     4     {
     5         for(int j=1; j<(n+1)/2; j++)
     6         {
     7             //表示以i开头,到i后面j项为止的等差数列和
     8             int sum = i*j+(j*(j-1)/2);
     9             if(sum == n)
    10             {
    11                 printContinuous(i, i+j-1, n);
    12             }
    13         }
    14     }
    15 }

      可以看出,数学对于一些算法还是比较重要的,不能说一定会提高程序的运行效率,但在解决一些问题是,数学上的知识会帮助我们更加清晰化的解法。

    posted on 2014-11-09 12:13 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/4084895.html

    展开全文
  • 有序序列的随机化

    2020-09-04 23:54:17
    一、引子 ...说明:在Excel表中选中区域排序时,同一行相当于绑定在一起 三、使用C++生成随机序列(该序列为自然数序列,且序列内不含重复元素) #include<vector> #include<ran..

    目录

     

    一、引子

    (1)问题

    (2)问题抽象:

    二、一种随机化的方法(原理如下图演示)

    (1)说明:

    (2)特点:

    三、使用C++生成随机序列(该序列为自然数序列,且序列内不含重复元素)


     

    一、引子

    (1)问题

    1. 将一副排好的扑克进行洗牌。
    2. 由序列3,8,2,5,9,4重新随机排列后得到另一个序列 

    (2)问题抽象:

    1. 将一个有序序列随机化
    2. 将一个序列A关联到一个有序计数序列B,使用随机化后的计数序列B’去重排序列A

    二、一种随机化的方法(原理如下图演示)

    (1)说明:

    1. 在Excel表中对选中区域排序时,同一行相当于绑定在一起

    (2)特点:

    1. 可以对指定序列重排
    2. 可以很容易地生成没有重复元素的随机序列
    3. 随机序列中的随机数只用于排序,而不参加结果的计算
    4. 对应算法性能分析:时间复杂度取决于排序算法的时间复杂度。是比较高效的。

    三、使用C++生成随机序列(该序列为自然数序列,且序列内不含重复元素)

    #include<vector>
    #include<random>
    struct Pair
    {
    	unsigned int_num;//对应计数序列
    	unsigned rand_num;//对应辅助序列
    };
    bool isSmall_randnum(const Pair& s1, const Pair& s2)
    {
    	return s1.rand_num < s2.rand_num;
    }
    int get_randseqlist(vector<unsigned>& randseqlist,int num)
    {
    	/*
    	函数功能:生成由0到num-1的num个整数构成的一个随机序列。随机序列通过randseqlist传出
    	*/
    	
    	randseqlist.clear();
    	Pair pair;
    	vector<Pair> pairs;
        
        //生成随机数
    	static default_random_engine e;
    	static uniform_int_distribution<unsigned> u(0, num);
    	
    	for (unsigned i = 0; i < num; i++)
    	{
    		pair.int_num = i;
    		pair.rand_num = u(e);
    		pairs.push_back(pair);
    	}
    	sort(pairs.begin(), pairs.end(), isSmall_randnum);//以rand_num为“关键字”排序
    	for (size_t i = 0; i < num; i++)
    	{
    		randseqlist.push_back(pairs[i].int_num);
    	}
    	return 0;
    }

     

    展开全文
  • 今天介绍用遍历法和二分法查找一... 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。 下面用遍历法找一个数组

    今天介绍用遍历法和二分法查找一个有序数组中的某一个值

    二分法查找的优点:二分法查找相比于遍历法效率更高,可以更快地解决问题。计算简单方法可靠,对f (x) 要求不高(只要连续即可),收敛性总能得到保证。

    二分法查找的缺点:是无法求复根及偶重根,收敛慢。 二分法原理:设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。

    下面用遍历法找一个数组中的某一值:

    #include <stdio.h>
    int main()
    {
    	int syc[] = { 1,2,3,4,5,6,7,8,9,10 };//数组
    	int k = 8;
    	int i = 0;
    	int sz = sizeof(syc) / sizeof(syc[0]);
    	for (i = 0; i <= sz; i++)
    	{
    		if (k == syc[i])
    		{
    			printf("找到了,下标是:%d\n,i");
    			break;
    		}
    	}
    	if (i == sz)
    		printf("找不到\n");
    	return 0;
    }
    

    结果如下:

    在这里插入图片描述

    二分法查找:

    
    #include <stdio.h>
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    	int k = 7;
    	int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
    	int left = 0;//左下标
    	int right = sz - 1;//右下标
    	while (left <= right)
    	{
    		int mid = (left + right) / 2;
    		if (arr[mid] > k)
    		{
    			right = mid - 1;
    		}
    		else if (arr[mid] < k)
    		{
    			left = mid + 1;
    		}
    		else
    		{
    			printf("找到了,下标是:%d\n",mid);
    			break;
    		}
    	}
    		if (left > right)
    		{
    			printf("找不到\n");
    		}
    		return 0;
    	
    }
    

    计算结果:

    在这里插入图片描述

    两种算法大家也可以分析一下利弊。

    展开全文
  • 嵌套映射的理解

    2013-08-25 14:13:59
    问题0:给定自然数n,找出所有不同的有序对i和j,其中1 我们这里只考虑问题的前一部分,并记为 问题1: 给定自然数n,找出所有不同的有序对i和j,记为( i, j ),其中1 在问题0中,序(i,j)和(j,i)是等价的,所以...
  • 2019-03-13 11:52:20
    秩在中文中的引申义是次序有序的意思。 首先要明确,秩是一个数,并且是一个自然数,只能取 0,1,2,3,4,当我们说一个矩阵的秩是几的时候,我们到底在说什么? 第一个角度,也就是书本上的定义,矩阵中的任意一...
  • 设集合 S 和 T,S ×T 的元素(a,b)称作有序对,又称作有序二元组或二元组 二元关系 .S × T 的子集称作 S 到 T 的二元关系. 其中,S 到 S 的二元关系,即 S ×S 的子集,称作 S 上的二元关系.
  • 首先先看一个实例问题:给定了自然数n,找出所有不同的有序对i和j,其中1≤j<i≤n1 \leq j < i \leq n1≤j<i≤n,使得i+ji + ji+j是素数。例如,假定n是6,满足条件的序就是: 完成这一计算的一种很自然...
  • 数(Number)

    2016-11-13 18:14:00
    --读《自然数原本:数数论》(薛海明,山西科学技术出版社)和《数论概论》([美]Joseph H.Silverman,机械工业出版社)笔记 ...自然数具有离散性和有序性。在自然数之上,人们可以进行运算,最基本...
  • 二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第四行输入m,表示...
  • DS二叉排序树之查找

    2020-12-15 20:41:25
    二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第四行输入m,表示...
  • 目录36 求100以内的素数37 数字排序38 求角线元素之和39 数组插入数字保持有序 36 求100以内的素数 题目:求100以内的素数 指素数在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 代码: # 求100之...
  • 希尔伯特赞成对自然数的解释,该自然数将其序数属性置于其基数属性之前[1] [2]。 作者研究了数论中整数的有序用法,以便讨论这种方法的可能性和局限性。 作者希望本文澄清甚至纠正他在2018年1月的论文中讨论的...
  • DS二叉排序树之删除(带图示)

    万次阅读 2018-11-27 23:14:40
    二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第四行输入m,...
  • DS二叉排序树之删除

    2018-11-27 18:54:20
    二叉排序树进行中序遍历,可以得到有序的数据序列 输入 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第四行输入m,...
  • NENU校赛热身赛补-C

    2019-04-13 21:02:10
    在所有小于b的自然数构成的集合AA= {1,2,3,… ,bb- 1}中,称(c , d), c, d \in A(c,d),c,d∈A中,为一个有序简称序偶。 huge想知道cc和dd相乘后模bb等于aa的序偶有多少。 Input 总共有T(T \l...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

有序自然数对