2008 数值统计
Problem Description
统计给定的n个数中,负数、零和正数的个数。
Input
输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。
Output
对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的个数。
Sample Input
6 0 1 2 3 -1 0
5 1 2 3 4 0.5
0
Sample Output
1 2 3
0 0 5
分析:基础题。注意当输入为 0 时结束程序,认真读题鸭~
2008 代码如下
#include <stdio.h>
int main()
{
int n, a, b, c;
while(scanf("%d", &n) != EOF && n!=0)
{
a = 0;
b = 0;
c = 0;
for(int i=0; i<n; i++)
{
double x;
scanf("%lf", &x);
if(x < 0)
a = a + 1;
else if(x == 0)
b = b + 1;
else
c = c + 1;
}
printf("%d %d %d\n", a, b, c);
}
return 0;
}
一遍过~
2009 求数列的和
Problem Description
数列的定义如下:
数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。
Input
输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述。
Output
对于每组输入数据,输出该数列的和,每个测试实例占一行,要求精度保留2位小数。
Sample Input
81 4
2 2
Sample Output
94.73
3.41
分析:基础题
2009 代码如下
#include <stdio.h>
#include <math.h>
int main()
{
double m, n;
while(scanf("%lf %lf", &n, &m) != EOF)
{
double x = 0;
for(int i=0; i<m; i++)
{
x = x + n;
n = sqrt(n);
}
printf("%.2lf\n", x);
}
return 0;
}
① 注意一下:n 也需使用 double 类型!
2010 水仙花数
Problem Description
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。
现在要求输出所有在m和n范围内的水仙花数。
Input
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
Output
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
Sample Input
100 120
300 380
Sample Output
no
370 371
分析:
这道题主要注意两个方面:
1、会求一个数的各个位的数字;
2、注意输出格式,空格和换行。
2010 代码如下
#include <stdio.h>
#include <math.h>
int main()
{
int m, n;
while(scanf("%d %d", &m, &n) != EOF)
{
int num = 0;
for(int i=m; i<n+1; i++)
{
int sum = 0;
int mid = i;
while(mid)
{
sum = sum + pow(mid%10,3);
mid = mid/10;
}
if(i == sum)
{
if (num> 0)
printf(" ");
printf("%d", i);
num = num+1;
}
}
if(num == 0)
printf("no\n");
else
printf("\n");
}
return 0;
}
①
求一个数的个位:x % 10;
循环求出各个位数字:
while(x)
{
m = x % 10; //取当前数字的个位数
printf("%d", m);
x = x / 10; //舍去个位数
}
②
首先是:从小到大排列在一行内输出,之间用一个空格隔开
这里要保证最后一个数字后面不跟空格,所以不能简单的写成
printf("%d ", i);
需要进行特殊设定:
if (num> 0) //除去第一个空格
printf(" ");
printf("%d", i);
num = num+1;
其次是,每次循环最后输出后的空格:
if(num == 0)
printf("no\n");
else
printf("\n");
③ while
这个例子更加了解了while的用法,以前习惯性的都用 for 解决,感觉很顺手,其实有时候 while 会更合适!
2011 多项式求和
Problem Description
多项式的描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + …
现在请你求出该多项式的前n项的和。
Input
输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。
Output
对于每个测试实例n,要求输出多项式前n项的和。每个测试实例的输出占一行,结果保留2位小数。
Sample Input
2
1 2
Sample Output
1.00
0.50
分析:
头大,有时候写这种题也不能想太多…
第一反应就是先定义一个函数会比较简单,
然后还想着,怎么能一次能输完所有数,输出还能对应(事实是…我想多了)
然后就是 / 的使用要注意一下
2011 代码如下
#include <stdio.h>
#include <math.h>
double wow(int n)
{
double x = 0;
for(int i=1; i<n+1; i++)
{
x = x + (1.0/i) * pow(-1,i+1);
}
return x;
}
int main()
{
int m, n;
scanf("%d", &m);
for(int i=0; i<m; i++)
{
scanf("%d", &n);
double sum = wow(n);
printf("%.2lf\n", sum);
}
return 0;
}
①定义函数
如下:
double wow(int n)
{
double x = 0;
for(int i=1; i<n+1; i++)
{
x = x + (1.0/i) * pow(-1,i+1);
}
return x;
}
1、定义的函数名,不能和主函数中定义的任何变量重名(emm…我就是定义了个m,然后一直报错,我还想没有函数是m,憨憨竟是我自己…)
2、输出结果是double类型,定义函数时也应是double,在下面计算 x 时,注意!!除法不能直接写 1/i ,结果会是整数!!应该至少出现一个小数,i 定义的 int 类型,所以可以把 1 写成 1.0 ,即 1.0 / i。
3、最后需要有返回值,没有设置返回值默认输出 0 。
②关于一些空格回车乱七八糟
for(int i=0; i<m; i++)
{
scanf("%d", &n);
double sum = wow(n);
printf("%.2lf\n", sum);
想多之一:输入多次,不会只能输出一次吧,是不是要循环输入,再统一输出
事实:scanf 貌似是可以一直输入,点了回车会依次计算,不需要另外设置让结果循环输出。
想多之二:上一题的关于空格的严格要求让我这次严格定义了换行符号的出现,结果反而错了…
其实最后简单的跟个换行就可以了,我还设置的最后一个不换行
2012 素数判定
Problem Description
对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。
Input
输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。
Output
对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行。
Sample Input
0 1
0 0
Sample Output
OK
分析:定义了两个函数来解决,第一个函数判断是不是素数,第二个函数判断经过表达式计算后是否全为素数。
2012 代码如下
#include <stdio.h>
int su(int n)
{
int num = 0;
for(int i=2; i<n; i++)
{
if(n%i == 0 )
num = num+1;
}
if(num == 0)
return 1;
else
return 0;
}
int wow(int x,int y)
{
int sum = 0;
if(x > y)
{
int t;
t = x;
x = y;
y = t;
}
for(int i=x; i<y+1; i++)
{
int la = i*i+i+41;
int pan = su(la);
if(pan == 1)
sum = sum+1;
}
if(sum == y-x+1)
return 1;
}
int main()
{
int x, y;
while(scanf("%d %d", &x, &y) !=EOF )
{
if(x == 0 && y == 0)
break;
int ans = wow(x,y);
if(ans == 1)
printf("OK\n");
else
printf("Sorry\n");
}
return 0;
}
①
害,气死我了,我运行了三天都没过…然后第四天用G++提交直接过了。查了一下好像是因为C和G++要求不太一样,可能是我写的有点不合C的要求???可恶,啥时候问问小赵老师。
②如何判断素数
(这貌似和大众方法不太一样,但是很好理解)
int su(int n)
{
int num = 0;
for(int i=2; i<n; i++)
{
if(n%i == 0 )
num = num+1;
}
if(num == 0)
return 1;
else
return 0;
}
③
还需要注意:x 和 y 大小不定,在进行操作前,需要先进行排序。
④
还有:当x=0,y=0时,表示输入结束,该行不做处理。
输入结束的意思是,可以结束while循环,整个程序结束。一开始放到了while循环条件里,感觉不是很好,查了一下:
可以放在while大括号里,采用 break 。
还有&&的用法,总结很多遍了~
if(x == 0 && y == 0)
break;
2013 蟠桃记
Problem Description
喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
什么问题?他研究的问题是蟠桃一共有多少个!
不过,到最后,他还是没能解决这个难题,呵呵-
当时的情况是这样的:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
Input
输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。
Output
对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。
Sample Input
2
4
Sample Output
4
22
分析:代码很简单,主要是分析出来其中的数学关系
前一天蟠桃数 = (n + 1)× 2
2013 代码如下
#include <stdio.h>
int main()
{
int n;
while(scanf("%d", &n) !=EOF)
{
int num = 1;
for(int i=n; i>1; i--)
{
num = (num+1)*2;
}
printf("%d\n", num);
}
return 0;
}