第五届在线编程大赛月赛第一题:完全平方数的个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wingahi/article/details/28941959


第五届在线编程大赛月赛第一题:完全平方数的个数

题目详情:

给定整数区间[A,B]问其中有多少个完全平方数。

输入格式:

多组数据,包含两个正整数A,B 1<=A<=B<=2000000000。

输出格式:

每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数。

答题说明:

输入样例

1 1

1 2

3 10

3 3

输出样例:

1

1

2

0


题目分析:我一看到数值范围达到20亿,那么我的第一反应就是:1、该题是不是可以找出公式进行求解。2、该题是否可以缩小所需的循环范围(一般的题都会用到循环)。可想易知,这道题如果去找公式来求解的话,感觉不靠谱,比如1^2=1、2^2=4、3^2=9......n^2=m,这些数好像没有什么公式可循。但是,你会发现所谓的完全平方就知识一个数的平方而已,这道题就只是求A-B范围究竟有多少的平方数的个数。由此可知,从刚才的1^2=1、2^2=4、3^2=9.......可知,致使求连续的1、2、3、4........的平方究竟有多少个数实在[A,B]范围的。那么想一想:

     设a=sqrt(A),b=sqrt(B),那么a^2<=A,b^2<=B,并且在区间[a,b]中,任意两个数的乘积必定大于等于A,并且小于等于B,所以,我们只需要在区间[a,b]之间进行求解每个数的平方是否在区间[A,B]中并且进行计数就是最终所求解的个数。

程序如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int i,n,m,tn,tm,ts,cnt;
	while(scanf("%d %d",&n,&m)!=EOF)
	{
		cnt=0;
		tn=sqrt(n);
		tm=sqrt(m);
		for(i=tn;i<=tm;i++)
		{
			ts=i*i;
			if(ts>=n && ts<=m) 
			{
				cnt++;
			}
		}
		printf("%d\n",cnt);
	}
	return 0;
}

第五届在线编程大赛月赛第一题完全平方数个数--我哪儿错了?求指点

07-04

第五届在线编程大赛月赛第一题:完全平方数的个数rn题目详情:rn给定整数区间[A,B]问其中有多少个完全平方数。rn输入格式:rn多组数据,包含两个正整数A,B 1<=A<=B<=2000000000。rn输出格式:rn每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数。rn答题说明:rn输入样例rn1 1rn1 2rn3 10rn3 3rn输出样例:rn1rn1rn2rn0rnrn运行完全正常啊,为什么判我错了?rn提示:挑战失败:你的程序正常运行并输出了结果,但是答案错误rn 小提示 你的程序输出结果与测试数据中的输出结果不符rn我的代码如下:rn=================================================rn[code=csharp]rnusing System;rnusing System.Collections.Generic;rnusing System.Linq;rnusing System.Text;rnrnnamespace 完全平方数rnrn class Programrn rn static void Main(string[] args)rn rn int[] inputNum = new int[] 1,1,1,2,3,10,3,3 ;rnrn int maxNum = 0;rn int minNum = 0;rn CompleteSquareNumber csn = new CompleteSquareNumber(2000000000);rn rn // 只计算能成对的数据rn for (int i = 0; i < inputNum.Length / 2; i++)rn rn minNum = inputNum[2 * i];rn maxNum = inputNum[2 * i + 1];rn if (maxNum < minNum) // 数据错误,跳过本组rn rn continue;rn rn Console.WriteLine(csn.GetCSNCount(minNum , maxNum ).ToString());rn rn rn Console.ReadLine();rn rn rn rnrn // 获取指定范围内的完全平方数rn private int[] GetValue(int minValue, int maxValue)rn rn List numList = new List();rnrnrn return numList.ToArray();rn rn rn sealed class CompleteSquareNumberrn rn int[] allNums = null; // 保存所有的完全数rnrn public CompleteSquareNumber(int maxNum)rn rn CreateAllCompleteSquareNumber(maxNum);rn rnrn // 生成所有指定范围内内的完全平方数rn private void CreateAllCompleteSquareNumber(int maxNum)rn rn List AllCSNList = new List();rn AllCSNList.Clear();rnrn int iCurr = 0;rn int n = 1;rn while (true)rn rn iCurr = n * n;rn if (iCurr < maxNum)rn rn AllCSNList.Add((int)iCurr);rn rn elsern rn break;rn rn n++;rn rn allNums = AllCSNList.ToArray();rn rnrn // 获取指定范围内的完全平方数rn public int GetCSNCount(int minValue, int maxValue)rn rn int minIndex = 0;rn int maxIndex = 0;rnrn int iLen = allNums.Length;rn for (int i = 0; i < iLen; i++)rn rn if (allNums[i] >= minValue)rn rn minIndex = i;rn break;rn rn rn for (int i = minIndex; i < iLen; i++)rn rn if (allNums[i] > maxValue)rn rn maxIndex = i;rn break;rn rn rnrn return maxIndex - minIndex;rn rnrn rnrnrn[/code]

第五届在线编程大赛月赛指定题目:反向互

10-18

求大神看看我的代码哪里错了 提交显示错误 但是在找不到哪里有bugrnrnrn#includern#includern#includernrn#define MAX 2000rnrntypedef struct elementrn int stack[MAX];rn int top;rn element;rnrnrnrnelement * init_stack();rnint Is_empty(element *p);rnint Is_full(element *p);rnvoid Push( element *p, int i);rnint Pop(element *p);rnvoid turnover(char a[],char b[]);//b is turnovered by a;rnint com(char a[]);rnrnrnvoid main()rn char a[MAX];rn int n;rn while(1)rn rn scanf("%s",a);rn if(a[0]=='0') break;rn n=com(a); rn printf("%d\n",n);rn rn system("pause");rnrnrnrnrn/*******************function**********************/rnrnelement * init_stack()rn element *p=NULL;rn p=(element *)malloc(sizeof(element));rn p->top=-1;rn return p;rnrnrnint Is_empty(element *p)rn if(p->top==-1) return 1;rn else return 0;rnrnint Is_full(element *p)rn if(p->top==MAX-1) return 1;rn else return 0;rn rnrnrnvoid Push( element *p, int i)rn if(Is_full(p)) printf("the stack is full");rn elsern p->top++;rn p->stack[p->top]=i;rn rnrnint Pop(element *p)rn if(Is_empty(p)) rn printf("the stack is empty");rn return 0;rn rn elsern return p->stack[p->top--];rn rnrnrnrnrnvoid turnover(char a[],char b[])rn int i,j,length;rn j=0;rn length=strlen(a)-1;rn for(i=length;i>(length/2);i--,j++)rn b[j]=a[i];rn if(b[j]>='N') b[j]=b[j]-('N'-'A');rn else b[j]=b[j]+('N'-'A');rn rn b[j]='\0';rn j++;rnrnrnrnint com(char a[])rn rn char b[MAX];rn int i,j,num=0,flag=0;rn int num_max;rn int top=-1;rn element *p;rn i=j=0;rn p=init_stack();rn turnover(a,b); //b=a turnover and huburn rn while(1)rn if(a[i]=='\0' || b[j]=='\0') break;rn if(a[i]==b[j])rn i++;rn j++;rn num++;rn //ifrn elsern switch (flag)rn case 0: Push(p,num);Push(p,i); Push(p,j); i++; flag=1; break;rn case 1: i++; flag=2; break;rn case 2: j=Pop(p); i=Pop(p); num_max=num; num=Pop(p); rn j++; flag=-1; break; //a删除两个之后的num存到num_maxrn rn case -1:j++; flag=-2; break;rn case -2:flag=-3; break;rn rn if(flag==-3) break;rnrn //elsernrn rn rn if(num_max>num)rn return num_max;rn else return num;rnrnrnrnrnrn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭