第一次排位赛总结
进入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
这道题有点类似我们经常做的数学题,给一个新的定义,根据新的定义求解,题目很长,定义很新,当我们被绕晕的时候,可以看看样例的规律,可以猜测
输入样例 | 输出样例 |
---|---|
2 | 1 |
3 | 2 |
4 | 3 |
… | … |
n | n-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 Input2
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;
}
这道题把偶数分解为两个素数和,用暴力法,的确十分的复杂,当时也是把我循环嵌套晕了,报错找错都花费了很长时间,结果还是没能拿下,听学长讲解可以跟去倍数排除,或者开方的方法简化,目前还没能掌握,等下次一并附上最优解。
通过这几天的刷题学会了一些新知识,但掌握程度还不熟练,一些新的方法还得总结运用,另外还有部分题还没有解出来,将在下次与此次的最优解一同发表出来。