Nia618 2021-06-02 21:54 采纳率: 20%
浏览 426
已采纳

能不能找到规律或者数学公式?能知道随机一个数位于第几排(N几)?例如290

 

  • 写回答

14条回答 默认 最新

  • CX0405 2021-06-03 13:51
    关注

    290 在13行   想看哪个数在第几行在list.contains()里放几就行

    
     
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 关注

    我看出规律来了

    第一行一列

    第二个两列

    第三行三列

    然后第一行第一列和第二行第三行第一列是等差数列,差5

     

    评论
  • 关注

    第二行第二列和第三行第二列是等差数列,值差11

    第三行第三列和第四行第三列是等差数列,差17

    评论
  • 中考之前不改名 2021-06-02 23:08
    关注

    杨晖三角老变式了

    评论
  • 爱晚乏客游 2021-06-02 23:36
    关注

    如果你将函数转过来看,这就是一个二维的数组,6在【0,0】,13在【0,1】。。。,也就是arr数组就是这个表,第几行就是下表(i+j+1)//2就是行数,列数j+1.

    所以写了个简单的给你,需要设置一下最大质数表。可以输出具体哪一行哪一列。不过计算质数表需要花时间,这个值最好大一点。

    def get_prime(n):#求5-n以内的素数表
        IsPrime = [True] * (n + 1)
        IsPrime[1] = False
        for i in range(2, int(n ** 0.5) + 1):
            if IsPrime[i]:
                for j in range(i * 2, n + 1, i):
                    IsPrime[j] = False
        return [x for x in range(5, n + 1) if IsPrime[x]]
    
    def find(num,max_prime_num):
        L=get_prime(max_prime_num)
        Max=len(L)//2  #行数,要保证质数表的个数是这个值得两倍,
        print()
        arr=[]
        a=6
        for i in range(0,Max):
            row=[]
            r=i*L[i*2]
            c=L[i*2+1]
            num0=a+5*i
            #    每行第一个
            row.append(num0)
            for j in range(1,Max):
                num_j=num0+c*j
                row.append(num_j)
            arr.append(row)
        flag=True
        print("在{}行{}列三角形里面结果是".format(Max,Max))
        for i in range(len(arr)):
            for j in range(len(arr[0])):
                if arr[i][j]==num: #寻找某个数
                    flag=False
                    print("{}在第{}行,第{}列".format(num,(i+j+1)//2,j+1))
            if (flag and  i>num//5):
                print("{}不在表内".format(num))
                break
    find(290,100000)
    
    #out 
    #在4795行4795列三角形里面结果是
    #290不在表内

    实际上,在4795行和列里面,290并不在表中。而412有多处:

    412在第29行,第59列
    412在第7行,第5列
    412在第14行,第2列

    203就一处:

    203在第5行,第5列

    评论
  • groovy2007 2021-06-03 01:58
    关注

    重复的数字怎么办?比如76出现了两次。到底取哪一行的呢?

    更新:查了一下资料,对于几百位的大数n,目前没有特别高效的算法,最多可以做到O(n ^ (1/4))。

    将原表逆时针旋转90度将得到如下二维矩阵:

    6 13 20 27 34 41 48 55 ...
    11 24 37 50 63 76 89 102 ...
    16 35 54 73 92 111 130 149 ...
    21 46 71 96 121 146 171 196 ...
    26 57 88 119 150 181 212 243 ...
    31 68 105 142 179 216 253 290 ...

    第x行y列(x和y都从0开始)的数字为 6+5x+7y+6xy。如果知道了x和y,很容易推算出原来的行和列。所以问题就变成了求方程6+5x+7y+6xy = n的整数解,比如n=290则x=5, y=7。根据这篇文章 https://www.alpertron.com.ar/METHODS.HTM#SHyperb 以及 https://math.stackexchange.com/questions/242728/how-to-find-integer-solutions-for-axy-bx-cy-d/242764 最后可以化简为求(6x+7)(6y+5) = 6n-1。根据上面的链接,目前已知的解法就是对6n-1进行因子分解,然后看看x和y是不是整数,每做一次分解(6n-1 = a * b),大概有1/36的概率求得x和y都是整数。所以问题就转化成了对大数6n-1进行分解。如果存在比较小的因子的话,可以逐个尝试。否则,就要用到Pollard's rho算法,可以参考《算法导论》31章,或者网上的一些实现,比如https://www.geeksforgeeks.org/pollards-rho-algorithm-prime-factorization/ 根据维基百科https://en.wikipedia.org/wiki/Pollard's_rho_algorithm,该算法效率约为O(n ^ (1/4)),并且在1980年用了两个小时对一个78位的费马数做了分解。虽然80年至今,计算机的速度提高了几百万倍,也无非相当于在大数后面多加了几个0而已。所以结论是不存在高效算法,除非大数碰巧有一些较小的因子。上述结论还只是针对寻找n出现的任意一个位置,如果要寻找n第一次出现的位置,计算量更大。

    评论
  • qfl_sdu 2021-06-03 12:56
    关注

    研究一下规律每行数据的规律

    评论
  • CX0405 2021-06-03 13:53
    关注

    评论
  • loldota 2021-06-03 14:26
    关注
    package main
    
    import "fmt"
    
    func getPosOfNum(num int32) (row, col int32) {
    
    	var i int32
    	for i = 1; i < 65535; i++ {
    		start := calcNumWithPos(i, 1)
    		if (num-start)%(start+i) == 0 {
    			row = i + (num-start)/(start+i)
    			col = (num-start)/(start+i) + 1
    			return
    		}
    	}
    	return
    }
    
    func getPosOfNumRowMin(num int32) (int32, int32) {
    	maxStartRow := ((num - 6) / 5) + 1
    	var minRow int32
    	var minCol int32
    	var i int32
    	for i = maxStartRow; i > 0; i-- {
    		start := calcNumWithPos(i, 1)
    		if (num-start)%(start+i) == 0 {
    			row := i + (num-start)/(start+i)
    			if minRow == 0 || minRow > row {
    				minRow = row
    				minCol = (num-start)/(start+i) + 1
    			}
    		}
    	}
    	return minRow, minCol
    }
    
    func calcNumWithPos(row, col int32) int32 {
    	if row < col {
    		return 0
    	}
    
    	if row == col && row == 1 {
    		return 6
    	}
    
    	if col == 1 {
    		return calcNumWithPos(1, 1) + (row-1)*5
    	}
    
    	return calcNumWithPos(row-col+1, 1) + (calcNumWithPos(row-col+1, 1)+row-col+1)*(col-1)
    }
    
    func main() {
    	fmt.Println(calcNumWithPos(11, 11))
    	fmt.Println(calcNumWithPos(7, 6))
    	fmt.Println(getPosOfNum(76))
    	fmt.Println(getPosOfNumRowMin(76))
    }
    
    评论
  • 风雪一更 2021-06-03 16:59
    关注

    思考了10分钟,敲下了5行代码,就这?这也太简单了吧

    评论
  • 风雪一更 2021-06-03 17:07
    关注

    计算可得290在第13行第8项,代码简单易懂,建议采纳

    <script type="text/javascript">
    		var arr = [[6]];
    		for (var i=1;i<1000;i++) {
    			arr.push([]);
    			for (var j=0;j<i;j++) {
    				arr[i].push(arr[i-1][j]+5+6*[j])
    			}
    			arr[i].push(arr[i-1][arr[i-1].length-1]+7)
    		}
    		console.log(arr);
    		
    		for (var x=0;x<arr.length;x++) {
    			for (var y=0;y<arr[x].length;y++) {
    				if (arr[x][y]==290) {
    					alert(arr[x][y])
    					alert("第"+(x+1)+"行"+"第"+(y+1)+"项")
    				}
    			}
    		}
    	</script>
    评论
  • qfl_sdu 2021-06-03 22:32
    关注

    数列规律如下:

    1.第i行有i列,第i行i列的数据位7i-1

    2.数列中的每一列都是等差梳理,第j列的差是6j-1

    3.每一行中,第一列的元素是最小的,也就是说,当6i-1 > 需要查找的数时结束。

    根据以上规律,可以快速查找到数所在的行和列。C++代码实现如下:

    (如有帮助,请给个采纳,谢谢。)

    #include <iostream>
    #include <vector>
    using namespace std;
    struct StPostion
    {
    	int row;
    	int col;
    };
    void main()
    {
    	int i,j;
    	int nmb;  //需要查找的数字
    	int max;  //最多查找的行数
    	int start;//每一列开始的值
    
    	while(true)
    	{
    		vector<StPostion> vpos; //存储满足条件的值
    		cout << "请输入需要查找的数字:";
    		cin >> nmb;
    		if (nmb <= 0) //输入小于等于0的数结束程序
    		{
    			return ;
    		}
    		max = (nmb -1) / 5 +1;
    		//i行有i列个数据  a[i][i] = 7i -1 (n=1~max)
    		//第j列的公差是5j -1
    		//逐列查找
    		for (i = 1; i <=max; i++) //列
    		{
    			start = 7*i-1;
    			for (j = i; j<=max; j++) //行
    			{
    				if (start + (6*i -1)*(j-i) == nmb)
    				{
    					StPostion st;
    					st.row = j;
    					st.col = i;
    					vpos.push_back(st);
    				}
    			}
    		}
    		if (vpos.size() == 0)
    		{
    			cout << nmb <<"不在数列中" << endl;
    		}else
    		{
    			cout << nmb << "所在的行和列为:" << endl;
    			for (i = 0; i < vpos.size(); i++)
    			{
    				cout << "   " << vpos.at(i).row << "行," << vpos.at(i).col << "列" <<endl;
    			}
    		}
    		
    	}
    	
    
    }
    评论
  • 朝花夕拾喵 2021-06-04 10:59
    关注

     

    //6   13   20   27    34            6 + 7*(j) 
    //11  24   37   50                 11 + 13*(j)
    //16  35   54                      16 + 19*(j) 
    //21  46                           21 + 25*(j)  = 21 + (7 + 6*i)*j = 6 + 5*i + (7 + 6*i)*j
    //26                                            = 6 + 5*i + 7*j + 6*i*j      
    //
    //
    //
    //6 + 5*i
    #pragma warning(disable:4996)
    #include<iostream>
    #include<stdio.h>
    #include<stdbool.h>
    void solve() {
    	int n = 0;
    	bool vis = false;
    	scanf("%d", &n); n -= 6;
    	for (int i = 0; i * 5 <= n; i++) {
    		for(int j = 0; 7 * j <= n; j++){
    			if (5 * i + 7 * j + 6 * i * j == n) {
    				printf("可能在第%d行\n", i + j + 1);
    				//printf("%d %d mmm", i, (n - 5 * i) / 7);
    				vis = true;
    			}
    		}
    	}
    	if (vis == false)printf("该数不在排列中!");
    	return;
    }
    int main() {
    	int a = 10;
    	while (a--) {
    		solve();
    	}
    	return 0;
    }
    评论
  • Nia618 2021-06-04 13:45
    关注

    本次题目没有设计好,我只能先采纳,感谢各位大神的帮助,如果有什么要交流的随时私聊我

    评论
查看更多回答(13条)

报告相同问题?

悬赏问题

  • ¥20 arcgis制做交通拥堵时变图
  • ¥15 AD20 PCB板步线 这个要怎么步啊
  • ¥50 关于《奇迹世界》1.5版本,数据修改
  • ¥15 请问这个问题如何解决(关键词-File)
  • ¥50 visual studio 2022和EasyX图形化界面
  • ¥15 找一下报错原因,纠正一下
  • ¥50 Cox回归模型Nomogram图制作报错
  • ¥20 SQL如何查询多级用户的数据
  • ¥15 给车牌识别代码加一个识别轮廓长宽比的代码
  • ¥30 商品价格预测的transformer模型优化