A :次方的和
编程可以解决很多数学问题。请编程实现求一个数列 {n^K}(K为常数)的前N项和SN。
Sn = 1^K+2^K+3^K+4^K+……n^K.
Input Specification:
第一行输入一个自然数T,表示有T组数据。
下面T行,每行输入两个整数N, K。其中0 < N < 50, 0 < K < 11。
N表示项数,K是数列元素的指数。
Output Specification:
每组数据对应一个整数SN。
Sample Input:
11 2
Sample Output:
1
本题要注意的有两点:
1、数据比较大,要用long long存储。
2、不能用math.h里的pow(),即使用floor(pow()+0.5)也会存在误差。
<span style="font-size:14px;">#include <stdio.h>
#include <math.h>
//自己实现Pow函数
long long Pow(int a, int b)
{
long long ans = 1;
while(b --)
{
ans *= a;
}
return ans;
}
int main()
{
int T, N, K, i;
long long s = 0;
scanf("%d", &T);
while(T --)
{
scanf("%d%d", &N, &K);
for(i = 1; i <= N; i ++)
{
s += Pow(i, K);
// s += pow(i, K); //一定有误差,自己测试。
// s += floor(pow(i, K) + 0.5); //floor(m)是取不超过m的最大整数,但是还是不能避免误差。
}
printf("%lld\n", s);
s = 0;
}
return 0;
}</span>
测试数据:
Input:
4
22 10
41 10
44 4
32 1
Output:
67403375450475
57013865269490101
34885686
528
B:约分最简分式
分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
Input Specification:
输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如: 12/34 表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
Output Specification:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如 5/6表示6分之5。
Sample Input:
60/120
Sample Output:
1/2
来源:http://www.patest.cn/contests/mooc-c/05-1
题目很简单,直接上代码。
<span style="color:#009900;"><span style="font-size:14px;">#include <stdio.h>
//辗转相除法求最大公约数
int gcd(int x, int y)
{
int r;
while (y != 0)
{
r = x % y;
x = y;
y = r;
}
return x;
}
int main()
{
int a, b;
scanf("%d/%d", &a, &b);
int c = gcd(a, b);
printf("%d/%d", a/c, b/c);
return 0;
}</span></span>
C:数字分类
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
· A1 = 能被5整除的数字中所有偶数的和;
· A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
· A3 = 被5除后余2的数字的个数;
· A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
· A5 = 被5除后余4的数字中最大数字。
Input Specification:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
Output Specification:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
Sample Input:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
Sample Output:
30 11 2 9.7 9
来源:http://www.patest.cn/contests/pat-b-practise/1012
这题只要对数组了解即可,没有算法什么成分。
<span style="color:#009900;">#include <stdio.h>
int main()
{
int a[1005], N, i;
int n1 = 0, n3 = 0;
scanf("%d", &N);
int A1 = 0, A2 = 0, A3 = 0, A5 = -1;
double A4 = 0;
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
for(i = 0; i < N; i++)
{
if(a[i] % 5 == 0 && a[i] % 2 == 0)
A1 += a[i];
if(a[i] % 5 == 2)
A3++;
if(a[i] % 5 == 3)
{
A4 += a[i];
n3++;
}
if(a[i] % 5 == 4)
A5 = a[i] > A5 ? a[i] : A5;
if(a[i] % 5 == 1)
{
if(n1 % 2)
a[i] = -a[i];
A2 += a[i];
n1++;
}
}
if(A1 == 0)
printf("N ");
else
printf("%d ", A1);
if(n1 == 0)
printf("N ");
else
printf("%d ", A2);
if(A3 == 0)
printf("N ");
else
printf("%d ", A3);
if(n3 == 0)
printf("N ");
else
printf("%.1lf ", A4 / n3);
if(A5 == -1)
printf("N");
else
printf("%d", A5);
return 0;
}</span>
D:换个格式输出整数
让我们用字母B来表示“百”、字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。
Input Specification:
每个测试输入包含1个测试用例,给出正整数n(<1000)。
Output Specification:
每个测试用例的输出占一行,用规定的格式输出n。
Sample Input:
234
Sample Output:
BBSSS1234
这题也是比较水的题,AC率很高。。。
<span style="color:#009900;">#include <stdio.h>
int main()
{
int n, i;
scanf("%d", &n);
for(i = 0; i < n / 100; i ++)
{
printf("B");
}
for(i = 0; i < n / 10 % 10; i ++)
{
printf("S");
}
for(i = 1 ;i <= n % 10; i ++)
{
printf("%d", i);
}
printf("\n");
return 0;
}</span>
E:猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。假设总共有604只猴子,请问是原来第几号猴子当选猴王?Output Specification:
输出当选猴王的编号。
本来想通过输入N,输出原来当选猴子的大王是几号。但是降低题目难度,就只要一个答案。
<span style="font-size:18px;color:#009900;">#include <stdio.h>
int main()
{
printf("215\n");
return 0;
}</span>
F:骨牌铺方格
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:
Input Specification:
输入一个整数T,表示有T组测试数据。(0<=T<=50)
以下的T行,每行一个测试实例。
每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0<n<=50)。
Output Specification:
对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。
Sample Input:
3
1
3
2
Sample Output:
1
3
2
来源:http://acm.hdu.edu.cn/showproblem.php?pid=2046
这题和爬楼梯的题目是一个道理,如果爬楼梯的题目都没做过,还是先看爬楼梯吧。我改了下输入格式,其他的一样。
<span style="font-size:18px;color:#009900;">#include <stdio.h>
int main()
{
long long f[51] = {1,2,3};
for(int i = 3; i < 51; i ++)
{
f[i] = f[i-1] + f[i-2];
}
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
printf("%lld\n", f[n-1]);
}
return 0;
}</span>
为什么这么解呢?我们参考一下别人的博客吧~
http://blog.csdn.net/lishuhuakai/article/details/8531214
以上就是普及组初赛的所有题目,如果觉得自己的程序是对的,但是AC不了。请联系科协软件部部长。