HDU 2008--2013 C语言程序设计练习(二)

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;
 } 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值