编者按:以下20道题目为自己练习所写的代码,均已提交检测通过,其中有些题也许有更优的解法,所以写的不好望读者包涵,由于个人练习,所以没有写注释,有什么问题的地方,可以留言一起交流学习。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第1道:
#include<stdio.h>
int main()
{int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};int year,month,day;while(scanf("%d/%d/%d",&year,&month,&day)!=EOF){int sum=0;for(int i=0;i<month-1;i++)sum=sum+a[i];sum=sum+day;if((year%4==0&&year%100!=0)||year%400==0)if(month>2)sum++;printf("%d\n",sum);}return 0;}//备注:其中在判断闰月加1天的时候必须当月份大于2时,才可以加1,否则将导致错误。
第2道:
#include<stdio.h>
#include<string.h>
int main()
{int len;int a,b;char str[51];char str2[200];int i=0 ;gets(str);len=strlen(str);a=len;b=len;strcpy(str2,str);while(i<len){str2[a++]=str[--b];i++;}str2[a]='\0';puts(str2);return 0;
}//备注:
//注意在编程过程中,当i为循环条件参数时,不可对其进行更改,解决办法是在定义一个变量对其备份。
第3道:
#include<stdio.h>
#include<string.h>
int main()
{int len;char str[256];int i=0 ;int j=0;gets(str);len=strlen(str);for(i=0,j=len-1;i<j;i++,j--){if(str[i]!=str[j]){break;}}if(i==j||i>j)printf("Y");elseprintf("N");return 0;
}//备注:
//在写判断条件的时候一定要注意,要将字符串为单数和双数的情况都考虑进去,否则将导致错误。
第4道:
#include<stdio.h>
int main()
{int a[41];int n;int i;scanf("%d",&n);a[0]=1;a[1]=1;for (i=2;i<41;i++){a[i]=a[i-2]+a[i-1];}for (i=0;i<n;i++){printf("%d ",a[i]);}return 0;
}
第5道:
#include<stdio.h>
#include<string.h>
int main()
{int i;int len;char str[200];while(gets(str)!=NULL){len =strlen(str);for (i=0;i<len-1 ;i++){if(str[i]=='/'&&str[i+1]=='/')str[i]='\0';}if(str[0]!='\0')printf("%s\n",str);}return 0;
}//备注:
//这里涉及到多行输入的方法,以后遇到类似问题也可以这么干。
第6道:
#include<stdio.h>
#include<string.h>
int main()
{int n;int i;int count=0;int temp;scanf("%d",&n);for(i=1;i<=n;i++){temp=i;if(i%7==0){count++;}else{while(temp){if(temp%10==7){count++;break;}temp=temp/10;}}}printf("%d\n",count);return 0;
}//备注:
//这道题的难点不在于找出7的倍数,而在于找出不是7的倍数但包含7的数字,这里用了移位的思想,
//这个思想很重要,以后遇到需要对数据的每一位操作时候的题目也可以考虑用这种思想试试。
第7道:
#include<stdio.h>
int main()
{int n,m;int i=0;int flag=0;//a+b=n;//2*a+4*b=m;while( scanf("%d%d",&n,&m)==2){flag=0;for(i=0;i<=n;i++){if((n-i)*4+2*i==m){printf("%d %d\n",i,n-i);flag=1;}}if(flag==0){printf("No answer\n");}}return 0;
}//备注:
//1.本题运用遍历思想。
//2.数据多组输入的方法需要掌握一下。
第8道:
#include<stdio.h>
int main()
{int m,n;int c;int temp;scanf("%d%d",&m,&n);c=m*n;if(m<n){temp=m;m=n;n=temp;}while(m%n){temp=m%n;m=n;n=temp;}printf("%d %d\n",n,c/n);return 0;
}//备注:
//”辗转相除法“求最大公约数,两数的和除以最大公约数求最小公倍数,这两种办法需要记住。
第9道:
#include<stdio.h>
int main()
{int n;double m,s;int i;scanf("%lf%d",&m,&n);s=m;for(i=0;i<n;i++){m=m/2;s=s+2*m;}s=s-2*m;printf("%.2f %.2f\n",m,s);return 0;
}//备注:
//一定要读清楚题目要求,举例子画图,不然及其容易出错。
第10道:
#include<stdio.h>
int main()
{int i,j;for(i=1;i<=9;i++){for (j=1;j<=i;j++){printf("%d*%d=%-2d ",j,i,i*j);}printf("\n");}return 0;
}//备注:
//该题看起来很简单,实际上很容易出错,错就错在打印格式,对齐方式等一定要注意。
第11道:
#include<stdio.h>
int main()
{int n;int i;int sum=1;scanf("%d",&n);for(i=1;i<n;i++){sum=2*(sum+1);}printf("%d",sum);return 0;
}
//备注:
//此题考察逆向思维,难点在于循环次数,为什么经历n天却只能循环n-次,
//原因是题目说了当天就吃了一半多一个,且最后一天还没吃就已经是1个了。所以只能循环n-1次。
第12道:
#include<stdio.h>
#include<math.h>
int main()
{int x1,y1,x2,y2;double d=0;while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)==4){printf("%.2f\n",sqrt(pow(abs(x1-x2),2)+pow(abs(y1-y2),2)));}return 0;
}//此题没有难度,只是为了熟悉常用的sqrt函数和pow函数。
第13道:
#include<stdio.h>
#include<math.h>
int main()
{int i=3025;for(i=1000;i<9999;i++){if((i/100+i%100)*(i/100+i%100)==i){printf("%d ",i);}}return 0;
}//备注:
//此题很简单,但是作者在做的时候有个犯了错误,原因是pow函数返回值是double类型,
//不可以和int类型的值进行比较,前玩不能用强转,转成int类型在进行比较
//原因是这样pow得到的结果会与真实结果有误差,因为会舍去小数部分。
第14道:
#include<stdio.h>
#include<math.h>
int main()
{int n;int i,j;int x,y;int a[10][10];int max=0;scanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);if(fabs(a[i][j])>fabs(max)){max=a[i][j];x=i+1;y=j+1;}}}printf("%d %d %d",max,x,y);return 0;
}//备注:
//主要注意多行输入以及下标需要加1。
第15道:
#include<stdio.h>
#include<math.h>
int main()
{double a,b,c;double t;double x1,x2;scanf("%lf%lf%lf",&a,&b,&c);t=pow(b,2)-4*a*c;if(t>0){x1=(-b+sqrt(t))/2*a;x2=(-b-sqrt(t))/2*a;}else{x1=x2=-b/2*a;}printf("%.2f %.2f\n",x1,x2);return 0;
}//备注:
//此题需要注意的一点就是在同时接收int类型和char类型的时候,空格会影响接收
//解决办法就是在scanf的%d之间也加上同样多的空格。
第16道:
#include<stdio.h>
int main()
{int n;int a[17];int i=0;while(scanf("%d",&n)==1){i=0;printf("%d-->",n);if(n<0){printf("-");n=-n;}if(n==0){printf("0");}while(n){a[i++]=n%2;n=n/2;}while(i--){printf("%d",a[i]);}printf("\n");}return 0;
}//备注:
//1.所有的进制转换都可以用这种方法
//2.这里最需要注意的是while(i--),这里while里面的i与while括号里面的i相差1.
第17道:
#include<stdio.h>
int main()
{int i,j,k;for(i=0;i<=20;i++){for(j=0;j<=34;j++){for(k=0;k<=100;k++){if(i+j+k==100&&5*i+3*j+k/3==100 &&k%3==0){printf("cock=%d,hen=%d,chicken=%d\n",i,j,k);}}}}return 0;
}//备注:
//1.这里采用的是暴力算法,遍历思想;
//2.这里用嵌套的先后顺序,巧妙的解决了题目要求的字典排序输出。
//3.尽管用暴力算法,也要想办法优化代码,比如鸡翁不可能超过20只,
//鸡母不可能超过34只,大大减少循环次数。
//4.鸡雏的价钱不能简单的用k/3,因为例如k为10的话,结果也为3,所以要加上k%==0这个条件。
第18道:
#include<stdio.h>
#include<string.h>int prime(int n)
{int i;int flag=0;for (i=2;i<n;i++){if(n%i==0){flag=1;break;}}if(flag==1)return 0;return 1;
}
int main()
{int n;int i;int count=0;scanf("%d",&n);for(i=2;i<=n/2;i++){if(prime(i)&&prime(n-i)){count++;}}printf("%d\n",count);return 0;
}//备注:
//1.一是要注意用函数对子功能进行封装,例如本题判断是不是素数。
//2.二是要注意重复情况的考虑,例如本体只遍历一般,将重复的情况去掉了。
第19道:
#include<stdio.h>
#include<string.h>
int main()
{int a,b;char c;scanf("%d %d %c",&a,&b,&c);switch(c){case '+':printf("%d",a+b);break;case '-':printf("%d",a-b);break;case '*':printf("%d",a*b);break;case '/':printf("%d",a/b);break;case '%':printf("%d",a%b);break;default :break;}return 0;
}//备注:
//这道题比较简单,主要是对switch的语法进行复习。
第20道:
#include<stdio.h>
enum hand{rock,paper,scissors};
enum ans{fail=-1,draw,win};
int main()
{int a,b;scanf("%d%d",&a,&b);if(a==rock&&b==scissors||a==scissors&&b==paper||a==paper&&b==rock){printf("%d\n",win);}else if(b==rock&&a==scissors||b==scissors&&a==paper||b==paper&&a==rock){printf("%d\n",fail);}else{printf("%d\n",draw);}return 0;
}//备注:本题主要是对枚举进行复习。