备战c语言考试1

1373 Circle

#include
#include

int main()
{
    int t;
    scanf("%d",&t);
    
    while(t--)
    {
        int x1,y1,r1,x2,y2,r2;
        scanf("%d%d%d%d%d%d",&x1,&y1,&r1,&x2,&y2,&r2);
        
        int dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
        int len1=abs(r1-r2);
        int len2=r1+r2;
        
        if(dist<len1*len1)    puts("1");
        else if(dist==len1*len1)    puts("2");
        else if(dist>len1*len1&&dist<len2*len2)    puts("3");
        else if(dist==len2*len2)    puts("4");
        else    puts("5");
    }
    
    return 0;
}

1374 连分数

#include
#include

long long gcd(long long a,long long b)
{
	return b>0?gcd(b,a%b):a;
}

long long a[15],b[15];

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n;
		scanf("%d",&n);
		
		for(int i=1;i<=n;i++)	scanf("%I64d",&a[i]);
		for(int i=1;i<=n;i++)	scanf("%I64d",&b[i]);
		
		if(n==1)
		{
			long long temp=gcd(a[1],b[1]);
			a[1]/=temp;
			b[1]/=temp;
			
			if(a[1]==1)	printf("%I64d\n",b[1]);
			else	printf("%I64d/%I64d\n",b[1],a[1]);
		}
		else
		{
			long long up=b[n],down=a[n];
			for(int i=n;i>=2;i--)
			{
				long long temp=gcd(up,down);
				up/=temp;
				down/=temp;
				
				long long temp1=down,temp2=up;
				up=b[i-1]*temp1;
				down=a[i-1]*temp1+temp2;
			}
			
			long long temp=gcd(up,down);
			up/=temp;
			down/=temp;
			
			if(down==1)	printf("%I64d\n",up);
			else	printf("%I64d/%I64d\n",up,down);
		}
	}
	
	return 0;
}

一直在想如果我除的时候出现了小数,但是我又只可以整除,我该怎么处理,如果用double的话,只可以保留一定的精度,不够准确,所以这里需要推导一下公式是什么样子,很简单,代入一个特殊情况就可以推导出来,比如说,备战c语言考试1_第1张图片
不需要计算出结果,化简表达式即可,然后OJ 要用%I64d 提交,注意代换的时候变量会发生变化,所以要用临时变量来保存,最大公约数的函数需要记住

1375 Fibonacci

#include

#define N 100

int a[N],b[N],c[N];

void start()
{
	a[1]=b[1]=c[1]=1;
	a[2]=b[2]=c[2]=1;
	for(int i=3;i<=N;i++)
	{
		a[i]=a[i-1]+a[i-2];
		b[i]=b[i-1]+b[i-2];
		c[i]=c[i-1]+c[i-2];
	}
}

int main()
{
	start();
	
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		int n;
		scanf("%d",&n);
		
		int cnt=0;
		
		//bool flag=false;
		
		for(int i=1;i<=45;i++)
		{
			for(int j=i;j<=45;j++)
			{
				for(int k=j;k<=45;k++)
				{
					if(a[i]+b[j]+c[k]==n)
					{
						if(i==2)	break;
						if(j==2)	break;
						if(k==2)	break;
						
						cnt++;
						//printf("%d=%d+%d+%d\n",n,a[i],b[j],c[k]);
						//continue;
						//flag=true;
						//主要是因为数组里面有两个数字是一样的
						break;
					}
				}
				
				//flag=false;
			}
		}
		
		printf("%d\n",cnt);
	}
	
	return 0;
}

计算下标达到多少的时候数值可以达到1e9

#include

int a[10000000];

int main()
{
	a[1]=1;
	a[2]=1;
	
	for(int i=3;i<=1000000000;i++)
	{
		a[i]=a[i-1]+a[i-2];
		
		if(a[i]>1000000000)	
		{
			//printf("%d\n",i);
			break;
		}
	}
	
//	printf("%d\n",a[45]);
	
	for(int i=1;i<=45;i++)
	{
		printf("%d\n",a[i]);
	}
	
	return 0;
}

首先预处理出来所有的斐波那契数列,经过计算发现第45个数字就超过了1000000000,数据范围比较小,可以直接三重循环求解,交换顺序算作同一个情况,所以让数字从小到大不严格单调递增排列即可,但是可以发现有一些问题,主要是因为,斐波那契数列第一个数字和第二个数字相等,所以特殊处理一下前面两个数字,通俗的说,只要使用到了第二个斐波那契数列,就直接跳过

其实我以为数字会比较大,三层循环会超时,但是其实数字只有45,所以完全不用担心

你可能感兴趣的:(#,湘大,XTU,OJ,c语言,开发语言)