第一次排位赛总结

第一次排位赛总结

进入thoughtworks实验室有一周时间了,而本周末也迎来了第一次的排位赛,与他人的差距还是很大,革命尚未成功,同志仍需努力!先对本次的部分题先在此做以此小结。

题目

1.链接 sky数

输入:含有一些四位正整数,如果为0,则输入结束。
输出:若n为Sky数,则输出“#n is a Sky Number.”,否则输出“#n is not a Sky Number.”。每个结果占一行。注意:#n表示所读入的n值。

题解如下

#include<stdio.h>
int sixth(int n)
{
	int sum=0;
	while(n!=0)
	{
		sum+=n%16;
		n/=16;
	}
	return sum;
}
int twelve(int n)
{
		int sum=0;
		while(n!=0)
		{
			sum+=n%12;
			n/=12;
		}
		return sum;
}
int ten(int n) 
{
	  int sum=0;
	  while(n!=0)
	  {
	  	sum+=n%10;
	  	n/=10;
	  }
	  return sum;
}
int main(void)
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
		break;
		else if(ten(n)==sixth(n)&&ten(n)==twelve(n))
		{
			printf("%dis a Sky Number.\n",n);
		}
		else{
			printf("%dis not a Sky Number\n",n);
		}	
	}
	return 0;
}//运用调用函数可以使代码看起来更加的有序,易懂,可读性更高。

sky数主要考的是进制的转化,十六,十二,十进制的转换,因为对于这部分内容掌握的不熟练,当时读完题后,并发现进制转化没有思路,直接放弃了,现在明白后,发现进制转化的规律大同小异,是很好理解的,下次遇到进制转化就得要做拿分了。

题目

2.链接 熊熊的尝试

Input
输入数据首先包含一个正整数C(C<=100),表示有C组测试数据。
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。
Output
如果先走的人能赢,请输出“first”,否则请输出“second”,每个实例的输出占一行。

题解如下:

#include<stdio.h>
int main()
{
	int k;
	scanf("%d",&k);
	while(k--)
	{
		int n,m;
		scanf("%d%d",&n,&m);
		if(n%(m+1)!=0)
		printf("first\n");
		else
		printf("second\n");
	}
	return 0;
}

这道题也是我唯一过了的一道题,原理就是巴什博弈,是有规律可寻的,显然,如果n=m+1,则先手必败;如果n=m-1,则先手必赢,即若总数是m+1的k倍,则先手必输,若总数是m-1的k倍,则先手必赢。

题目

3. 咦!这是嘛呀!

题目

4.链接 倩姐的自我突破

输入
第一行输入一个整数 T(T < 1000), 表示测试用例的行数.
对于每个测试用例,都有一行包含一个整数 n.
保证 2
输出
对于每个测试用例,打印一个整数 S 对 n 取模后的值.
提示
第一个测试用例 S = 1* 1!= 1, 并且 1 的模 2 运算 1.
第二个测试用例 S = 11!+2 2!= 5 , 并且 5 对 3 取模是 2.
Sample Input

2
2
3

Sample Output

1
2

这道题有点类似我们经常做的数学题,给一个新的定义,根据新的定义求解,题目很长,定义很新,当我们被绕晕的时候,可以看看样例的规律,可以猜测

输入样例输出样例
21
32
43
nn-1

然后根据此规律,打出代码,点击提交(不会的时候去猜测尝试也不亏)。

题解如下:

  #include<stdio.h>
int main()
{
	int T,n;
	scanf("%d",&T);
	while(T--)
	{
	 scanf("%d",&n);
	 printf("%d\n",n-1);
    }
     return 0;
}




结果就恭喜accept了,这道题让我明白了原来写代码也可以懵的,还有就是多看看样例,也许就可以得到规律,同时也不应该局限于样例,这样思考问题才会考虑发周全,至于这道题的正确解法,还没想出来,等下次再发表出来吧。

题目

5.链接 看看就好,劝一下自己

输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000
Output
对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
Sample Input

2
220 284
100 200
Sample Output
YES
NO

题解如下:

#include<stdio.h>
int main()
{
    int x,y,n,i,f;
    int z[1000],k=0; 
	int a=0;
    scanf("%d",&n);
	for(f=0;f<n;f++)
	{	  
	 int sum1=0,sum2=0;
     scanf("%d%d",&x,&y);
     for(int i=1;i<x;i++)
     {  
       if(x%i==0)
       {
	     sum1+=i;
       }
     }
    for(int j=1;j<y;j++)
    {
    	if(y%j==0)
    	{
    		sum2+=j;
		}
	}
	if(k<n)
	{
	   if(sum1==y&&sum2==x)
	    {
		    a=1;
		}
     	else{
	          a=0; 
		    }
	   z[k]=a;
	   k++;
	 }
   }
   for(k=0;k<n;k++)
  {
  	if(z[k]==1)
  	printf("YES\n");
  	else if(z[k]==0)
  	printf("NO\n");
  }
	return 0;	
}

这里要注意输出的格式,先输出输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数,即先把所有数据输出,再统一输出,当时没有注意到,导致提交一直没有通过。

题目

6.链接 哥德巴赫来了可能有用吧

输入
倩倩学姐想把一个偶数拆成两个不同素数的和,你有有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input

加粗样式 30
26
0

Sample Output

3
2

题解如下

#include<stdio.h>
int main(void)
{
   int 	n,i,a,j,x=0;
   int  f[1000];
   while(scanf("%d",&n)!=EOF)
   {
   if(n!=0)
   {  
      int sum=0; 
   for(i=2;i<n;i++)
   {  
     int a=1;
   	 for(j=2;j<i;j++)
	   {
	  	if(i%j==0)
	     {
	     	a=0;
	     	break;
		 }
	   		  	
	   } 
      if(a==1)
       {   
   	     f[x]=i;
   	     x++;
   	     sum++;
       }

   } 
     int z=0;
     for(x=0;x<=sum/2;x++)
     {
  	 for(j=1;j<=sum;j++)
  	    {
		  if(f[x]+f[j]==n)
		  {
		 	z++;
		  }
  		
	    }  
     }
      printf("%d\n",z);
  }
 }  
   return 0;
}

这道题把偶数分解为两个素数和,用暴力法,的确十分的复杂,当时也是把我循环嵌套晕了,报错找错都花费了很长时间,结果还是没能拿下,听学长讲解可以跟去倍数排除,或者开方的方法简化,目前还没能掌握,等下次一并附上最优解。

通过这几天的刷题学会了一些新知识,但掌握程度还不熟练,一些新的方法还得总结运用,另外还有部分题还没有解出来,将在下次与此次的最优解一同发表出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值