zoukankan      html  css  js  c++  java
  • 45 等差数列

    45 等差数列

    作者: xxx时间限制: 1S章节: 一维数组

    问题描述 :

    一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...) 在这个问题中a是一个非负的整数,b是正整数。

    写一个程序来找出在双平方数集合S中长度为n的等差数列。双平方数集合是所有能表示成p2+q2的数的集合。

    输入说明 :

    第一行: N(3<= N<=25),要找的等差数列的长度。 第二行: M(1<= M<=250),搜索双平方数的上界0 <= p,q <= M。

    输出说明 :

    如果没有找到数列,输出`NONE'。

    如果找到了,输出一行或多行, 每行由两个整数组成:a,b 这些行应该先按b排序再按a排序(均为升序)。

    将不会有多于10,000个等差数列。

    输入范例 :
    5 7
    输出范例 :
    1 4
    37 4
    2 8
    29 8
    1 12
    5 12
    13 12
    17 12
    5 20
    2 24

    代码

    #include <stdio.h>
    int ans[1000100], f[1000000];
    int n, m, l = 0, k, d1 = 0;
    int main(){
    
    	scanf("%d%d", &n, &m);//输入
    	for (int p = 0; p <= m; p++)
    	for (int q = 0; q <= m; q++)
    		ans[p*p + q*q] = 1;//将可以表示为q*q+p*p的数标记为一
    	l = 0;
    	for (int i = 0; i <= m*m + m*m; i++)
    	{
    		l += ans[i];
    		if (ans[i])
    			f[l] = i;//求出第l个
    	}
    	for (int j = 1; j <= m*m * 2 / (n - 1); j++)
    	{//枚举长度
    		for (int i = 1; i <= l; i++)
    		{//枚举起点
    			if (f[i] + j*(n - 1)>m*m * 2)
    				break;//如果已大于最大值就退出
    			int c = 1, d = f[i];
    			for (int k = 1; k <= n - 1; k++)
    			{
    				d = d + j;//枚举每一项
    				if (!ans[d])
    				{//如果不是就退出
    					c = 0;
    					break;
    				}
    			}
    			if (c){ d1 = 1; printf("%d %d
    ", f[i], j); }//判断输出
    		}
    	}
    	if (d1 == 0)printf("NONE
    ");//如果没有合法序列输出NONE
    	return 0;
    }
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    植物-常见植物:苍耳草
    Linux 服务的加入删除,自己主动执行及状态
    HTML标签列表
    cocos2d js ClippingNode 制作标题闪亮特效
    被AppStore拒绝理由(一)
    開始学习hadoop
    改动mysqlpassword
    hdu 1874 畅通project续
    发现百度开源一个好东西,Echarts统计报表前段框架
    一个基于cocos2d-x 3.0和Box2d的demo小程序
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12775656.html
Copyright © 2011-2022 走看看