m0_58150203
Nia618
2021-06-02 21:54
采纳率: 50%
浏览 414

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

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

14条回答 默认 最新

  • CX0405
    CX0405 2021-06-03 13:51
    已采纳

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

    
     
    点赞 1 评论
  • weixin_43681859
    答题大神 2021-06-02 22:00

    我看出规律来了

    第一行一列

    第二个两列

    第三行三列

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

     

    点赞 评论
  • weixin_43681859
    答题大神 2021-06-02 22:01

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

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

    点赞 评论
  • weixin_56814020
    中考之前不改名 2021-06-02 23:08

    杨晖三角老变式了

    点赞 评论
  • qq_34124780
    爱晚乏客游 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
    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
    qfl_sdu 2021-06-03 12:56

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

    点赞 评论
  • CX0405
    CX0405 2021-06-03 13:53

    点赞 评论
  • loldota
    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))
    }
    
    点赞 评论
  • qq_41728631
    风雪一更 2021-06-03 16:59

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

    点赞 评论
  • qq_41728631
    风雪一更 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
    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;
    			}
    		}
    		
    	}
    	
    
    }
    点赞 评论
  • Azxz0_0
    朝花夕拾喵 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;
    }
    点赞 评论
  • m0_58150203
    Nia618 2021-06-04 13:45

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

    点赞 评论

相关推荐