杭电oj–简单操作

  • Post author:
  • Post category:其他




2000-ASCII码排序

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
    char a,b,c;
	while(scanf("%c %c %c",&a,&b,&c)!=EOF){
		getchar();
		if(a<b){
			if(a>c)  printf("%c %c %c\n",c,a,b);
			else if(b<c) printf("%c %c %c\n",a,b,c);
			else printf("%c %c %c\n",a,c,b);
		}
		else{//b<a
			if(c<b) printf("%c %c %c\n",c,b,a);
			else if(a<c) printf("%c %c %c\n",b,a,c);
			else printf("%c %c %c\n",b,c,a);
		}
	
	}
	return 0;
} 

第一次没加getchar,这什么玩意??

在这里插入图片描述

第一次没有加getchar()函数,结果不正确,运行时,第一次输入三个字符排序正确,可是后面再输入时输出就会错误。从键盘输入的字符,会存放到缓冲区中,包括回车符。如输入“abc回车”之后,缓冲区中存了有四个字符’a’、‘b’、‘c’、’\n’,如果上面程序中没有getchar(),则第一次从缓冲区中提取了三个字符之后,还剩下了一个’\n’,则下次再输入三个字符时,缓冲区中会把上次剩下的回车符也算进去,这样处理起来就会有问题。所以另一种做法是在scanf的时候就输入4个


scanf(“%c %c %c %c”,&a,&b,&c,&d);

用d来接收回车符getchar()是从缓冲区中读取一个字符,如果只是去除缓冲区中的字符,不需要用赋值表达式,直接使用getchar();就行。



2001-计算两点间的距离

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double x1,y1,x2,y2;
	while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF){
		printf("%.2f\n",sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
	}
	
	return 0;
} 

这题没啥坑,不过我把lf写成f之后就全部都是0.00,而且

平方不能写成(x1-x2)^2

可以用power函数

power((x1-x2),2)



2002-计算球体积

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double r;
	while(scanf("%lf",&r)!=EOF){
		printf("%.3lf\n",4*3.1415927*r*r*r/3);
	}
		
	return 0;
} 

这题也没有任何的难度,但是为什么3.1415926就wa???惊了我,而且记得除以三要放在最后,不然前面的4/3就会直接1



2003-求绝对值

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double r;
	while(scanf("%lf",&r)!=EOF){
		if(r>0)
		printf("%.2lf\n",r);
		else
		printf("%.2lf\n",-r);
	}
		
	return 0;
} 



2004-成绩转换
在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int a;
	while(scanf("%d",&a)!=EOF){
		if(a>100||a<0)
		printf("Score is error!\n");
		else if(a>=90&&a<=100) printf("A\n");
		else if(a>=80&&a<=89) printf("B\n");
		else if(a>=70&&a<=79) printf("C\n");
		else if(a>=60&&a<=69) printf("D\n");
		else if(a>=0&&a<=59) printf("E\n");

	}
		
	return 0;
} 



2006-奇数乘积
在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	int n,a;
	int sum=1;
	while(scanf("%d",&n)!=EOF){
		while(n--){
			scanf("%d",&a);
			if(a%2!=0){
				sum*=a;
			}
		}
		printf("%d\n",sum);
		sum=1;
	}
	return 0;
} 



2007-连续偶数的平方和、连续奇数的立方和

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	int m,n,i,temp;
	int odd=0,even=0;
	while(scanf("%d %d",&m,&n)!=EOF){
		if(m>n){
			temp=m;
			m=n;
			n=temp;
			
		}
		for(i=m;i<=n;i++){
			if (i%2==0) even+=i*i;
			else odd+=i*i*i;
		}
		printf("%d %d\n",even,odd);
		odd=0;
		even=0;
	}
	return 0;
} 

这题也没什么难度,就是注意如果m>n时要先交换,题目并没有说第一个数一定小于第二个数



2008-数值统计

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	int n;
	int neg=0,pos=0,zero=0;
	double a;
	scanf("%d",&n); 
	while(n!=0){
		while(n--){
			scanf("%lf",&a);
			if(a>0)  	pos++;
			else if(a==0) zero++;
			else neg++;	
		}
		printf("%d %d %d\n",neg,zero,pos);
		neg=0;
		pos=0;
		zero=0;
		scanf("%d",&n); 
	}
	return 0;
} 

这题注意a为double,第一次用int 报错了Time Limit Exceeded(为什么??)



2009-求数列的和

在这里插入图片描述

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	double n,m;
	double sum=0;
	while(scanf("%lf %lf",&n,&m)!=EOF){
		sum=n;
		while(--m){
		    sum+=sqrt(n);
		    n=sqrt(n);
			}
		
		printf("%.2lf\n",sum);
		sum=0;
	}
	return 0;
} 



2010-水仙花数
在这里插入图片描述

#include<iostream>
using namespace std;
int narcissus(int);
int main(){
	int n,m,i,a[1000];
	int num=0,k=0;
	while(scanf("%d %d",&n,&m)!=EOF){
		for (i=n;i<=m;i++){
		if(narcissus(i)){//是 
			num++;
			a[k++]=i; 
		  }
		}
		if(num==0)
		printf("no\n");
		else{
			
		   for(int j=0;j<k-1;j++){
			printf("%d ",a[j]);
			}
			printf("%d\n",a[k-1]); //最后一个换行 
		}
		num=0;
		k=0;
		
	}
	return 0;
} 
int narcissus(int i){
	int bai,shi,ge;
	bai=i/100;
	shi=(i-bai*100 )/10;
	ge=i%10;
	//printf("%d %d %d",bai,shi,ge);
	if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i) return 1;
	else return 0;
	
}

注意结果的展示形式,一行最后一个没有空格,直接换行。



2011-多项式求和

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	double m,n,a[102],sum=0;
	
	scanf("%lf",&m);
	while(m--){
		scanf("%lf",&n);
		for(int i=1;i<=n;i++){
			if(i%2==0) sum-=1/(double)(i);
			else sum+=1/(double)(i);	
		}
		printf("%.2lf\n",sum);
		sum=0;
	}
	return 0;
	
} 

这题主要是强制类型转换,还有注意lf,因为这个改了很久浪费了很多时间,小细节要更注意。



2039三角形

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
	int n;
	double a,b,c;
	scanf("%d",&n);
	while(n--){
		scanf("%lf %lf %lf",&a,&b,&c);
	    if(a<b){
	    	if(c>b){ //c最大 
	    		if(a+b<=c) printf("NO\n");
				else  printf("YES\n");
			}
			else{//b最大 
			    if(a+c<=b) printf("NO\n");
				else  printf("YES\n");
				
			}
		}
		else{ //b<a
		    if(c>a){ //c最大 
	    		if(a+b<=c) printf("NO\n");
				else  printf("YES\n");
			}
			else{//a最大 
			    if(b+c<=a) printf("NO\n");
				else  printf("YES\n");
				
			}	
		}
		}
	return 0;
} 

只要判断三条边中最大的那条就行



版权声明:本文为Sophia2333333331原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。