暑期练习——关于C语言的基础知识复习及相关题目解题技巧总结(1)

1.求绝对值


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 133683 Accepted Submission(s): 65578


Problem Description
求实数的绝对值。


Input
输入数据有多组,每组占一行,每行包含一个实数。


Output
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。


Sample Input
123
-234.00


Sample Output
123.00

234.00

解题代码:

/*根据题目可知,只需用if分支结构对输入的实数进行判断,再输出即可完成绝对值的转换*/

#include <stdio.h>
int main()
{
double a;   //注意数据类型
int t=-1;
while(scanf("%lf",&a)!=EOF)   //输入格式
{
if(a>1e-6) printf("%.2lf\n",a);    //此处应注意C语言中实数的正负不可与0直接比较,会产生误差
else printf("%.2lf\n",a*t);
}
return 0;
 } 



2.成绩转换


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 145938 Accepted Submission(s): 63947


Problem Description
输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:
90~100为A;
80~89为B;
70~79为C;
60~69为D;
0~59为E;


Input
输入数据有多组,每组占一行,由一个整数组成。


Output
对于每组输入数据,输出一行。如果输入数据不在0~100范围内,请输出一行:“Score is error!”。


Sample Input
56
67
100
123


Sample Output
E
D
A
Score is error!

解题代码:

/*由题目给出的输入及输出格式可以得出基本解题思路——用if分支语句或switch语句皆可解决此问题*/

#include <stdio.h>
int main() 
{
int a;
while(scanf("%d",&a)!=EOF)
{
if(a<=100&&a>=90)  printf("A\n");
else if(a<90&&a>=80) printf("B\n");
else if(a<80&&a>=70) printf("C\n");
else if(a<70&&a>=60) printf("D\n");
else if(a<60&&a>=0) printf("E\n");
else printf("Score is error!\n"); 
}
return 0;
}



3.第几天?


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 151010 Accepted Submission(s): 54221


Problem Description
给定一个日期,输出这个日期是该年的第几天。


Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。


Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。


Sample Input
1985/1/20
2006/3/12


Sample Output
20
71



解题代码:

/*由题目可以基本想到平年与闰年的差距,所以在计算的时候需要判断是平年还是闰年*/

#include <stdio.h>
int main()
{
int year,month,day;
while(scanf("%d/%d/%d",&year,&month,&day)!=EOF)   //输入格式与以往的空格有所不同,所以应当处理好小细节
{
int sum=0;
switch(month-1)     //用switch语句时,月份的计算是计算上一个月的,所以应当减1
{
   case 12:sum+=31;       //此处计算月份的累加应当应用一些小技巧,如break的应用,此处省略则使计算更便捷
case 11:sum+=30;
case 10:sum+=31;
case 9:sum+=30;
case 8:sum+=31;
case 7:sum+=31;
case 6:sum+=30;
case 5:sum+=31;
case 4:sum+=30;
case 3:sum+=31;
   case 2:sum+=28;
case 1:sum+=31;
}
sum+=day;     //先计算平年的,之后再判断是否为闰年,是则加1,否则原样输出
if(((year%4==0&&year%100!=0)||year%400==0)&&month>2) sum=sum+1;  //注意应判断所输入的月份是否大于2月,否则输入1月时会出现错误
printf("%d\n",sum);
}
return 0;
 } 




4.平方和与立方和


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 172891 Accepted Submission(s): 54941


Problem Description
给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。


Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。


Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。


Sample Input
1 3
2 5


Sample Output
4 28
20 152



解题代码:

/*看到题目时应当思考到奇数与偶数的判断方法;之后则要思考到运用for循环解决m到n这些数字的出现*/

#include <stdio.h>
int main()
{
int m,n,i;
while(scanf("%d%d",&m,&n)!=EOF)
{
long int p=0,l=0;
   if(m<n)            //题目中并未说m>n,所以应当判断m、n之间的大小关系
   {
  for(i=m;i<=n;i++)
    {
   if(i%2==0) p=p+(i*i);
   else l=l+(i*i*i);
   }    
}
   else {
      for(i=m;i>=n;i--)
      {
      if(i%2==0) p=p+(i*i);
      else l=l+(i*i*i);
  }
    }
printf("%Id %Id\n",p,l);
}
return 0;
 } 




5.多项式求和


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 79863 Accepted Submission(s): 45720


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



解题代码:

/*看到题目应先想到累加的方法,之后则应想到正负数的变换*/

#include <stdio.h>
int main()
{
int m,n,i,j;
while(scanf("%d",&m)!=EOF)
{

for(i=0;i<m;i++)
{
scanf("%d",&n);
double l=1.0,sum=0,t=-1.0;     //数据类型的定义一定要在此处,否则计算后面的数据时会沿用前一份数据
for(j=1;j<=n;j++)
{
t=(-1)*t;     //正负数的转换可以一正一负的方式判断,也可以用奇正偶负的方式判断
l=1.0/(j*t);
sum=sum+l;
}
printf("%.2lf\n",sum);
}
}
return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值