杭电ACM基础题(2000、2001、2002、2003、2004、2005、2006、2007、2008、2009、2010)

2000、ASCII码排序[简单的字符排序]

输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
Input
输入数据有多组,每组占一行,有三个字符组成,之间无空格。
Output
对于每组输入数据,输出一行,字符中间用一个空格分开。
Sample Input

qwe
asd
zxc

Sample Output

e q w
a d s
c x z

Code:

/*输入3个字符后,按字符的ASCII码递增的顺序进行排序 
即对单个字符进行比较
*/
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    char c[4];
    while(cin>>c){
        sort(c,c+3);
        for(int i=0;i<3;i++){
            if(i==0)
                cout<<c[i];
            else
                cout<<" "<<c[i];
        }
        cout<<endl;
    }
} 

2001、计算两点间的距离[简单的数学公式]

输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。
Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。
Output
对于每组输入数据,输出一行,结果保留两位小数。
Sample Input

0 0 0 1
0 1 1 0

Sample Output

1.00
1.41

Code

/*计算两点之间的距离,直接使用距离公式即可,简单的数学公式*/
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main(){
    double x1,y1,x2,y2,d;
    while(cin>>x1>>y1>>x2>>y2){
        d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        cout<<setiosflags(ios::fixed);
        cout<<setprecision(2)<<d<<endl;
    }
} 

2002、计算球体积[简单的球体体积公式]

根据输入的半径值,计算球的体积。
Input
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。
Output
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。
Sample Input

1
1.5

Sample Output

4.189
14.137

Code

/*给定球体的半径,求其体积,简单的体积公式*/
#include<iostream>
#include<iomanip>
#define PI 3.1415927
using namespace std;
int main(){
    double r;
    cout<<setiosflags(ios::fixed);
    while(cin>>r){
        double v=(4*PI*r*r*r)/3;
        cout<<setprecision(3)<<v<<endl;
    } 
    return 0;
} 

2003、求绝对值[简单]

求实数的绝对值
Input
输入数据有多组,每组占一行,每行包含一个实数。
Output
对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果保留两位小数。
Sample Input

123
-234.00

Sample Output

123.00
234.00

Code

//求实数的绝对值
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
    double a;
    cout<<setiosflags(ios::fixed);
    while(cin>>a){
        if(a<0){
            cout<<setprecision(2)<<(-1)*a<<endl; 
        }
        else{
            cout<<setprecision(2)<<a<<endl;
        }
    }
    return 0;
} 

2004、成绩转换[简单的条件判断]

输入一个百分制的成绩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!

Code

//输入百分制的成绩,将其转换为对应的等级,并输出
#include<iostream>
using namespace std;
int main(){
    int grade;
    while(cin>>grade){
        if(grade>=90&&grade<=100){
            cout<<"A"<<endl;
        }
        else if(grade>=80&&grade<90){
            cout<<"B"<<endl;
        }
        else if(grade>=70&&grade<80){
            cout<<"C"<<endl;
        }
        else if(grade>=60&&grade<70){
            cout<<"D"<<endl;
        }
        else if(grade>=0&&grade<60){
            cout<<"E"<<endl;
        }
        else{
            cout<<"Score is error!"<<endl;
        }
    }
    return 0;
} 

2005、给定一个日期,输出这个日期是该年的第几天

给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input

1985/1/20
2006/3/12

Sample Output

70
21

Code
注意对输入数据格式的转化

//给定一个日期,输出这个日期是该年的第几天 
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;

int leapyear(int year){
    if((year%4==0&&year%100!=0)||year%400==0){
        return 1;
    }
    else
        return 0;
}

int main(){
    //输入日期 如1985/1/20
    string data,years,months,days;
    while(getline(cin,data)){
        int len=data.size();//字符串的长度 
        //获得年份的字符串 
        years=data.substr(0,data.find_first_of("/"));//返回"/"在字符串中首次出现的位置 
        //获得月份的字符串 
        months=data.substr(data.find_first_of("/")+1,data.find_last_of("/")-data.find_first_of("/")-1);
        //获得日的字符串 
        days=data.substr(data.find_last_of("/")+1,len-data.find_first_of("/")-1);
        
        //将字符串转变为整型
        int year=atoi(years.c_str());
        int month=atoi(months.c_str());
        int day=atoi(days.c_str());//atoi()函数添加头文件 stdlib.h 
        int sum=0;
        //利用两个数组来存储在平年或者闰年每个月对应的天数 
        int num1[12]={31,29,31,30,31,30,31,31,30,31,30,31};
        int num2[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        
        //判断年份是平年还是闰年 
        if(leapyear(year)==1){
            for(int i=0;i<month-1;i++){
                sum=sum+num1[i];
            }
            sum=sum+day;
            cout<<sum<<endl;
        }else{
            for(int i=0;i<month-1;i++){
                sum=sum+num2[i];
            }
            sum=sum+day;
            cout<<sum<<endl;
        }
    }
    return 0; 
} 

2006、求n个整数中,奇数的乘积

给你n个整数,求他们中所有奇数的乘积。
Input
输入数据包含多个测试实例,每个测试实例占一行,每行的第一个数为n,表示本组数据一共有n个,接着是n个整数,你可以假设每组数据必定至少存在一个奇数。
Output
输出每组数中的所有奇数的乘积,对于测试实例,输出一行。
Sample Input

3 1 2 3
4 2 3 4 5

Sample Output

3
15

Code
判断其是奇数,依次相乘,比较简单

//输入n个整数,计算输入数据中奇数的乘积 
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int a,result=1;
        for(int i=0;i<n;i++){
            cin>>a;
            if(a%2==1){
                result=result*a;
            }
        }
        cout<<result<<endl;
    } 
    return 0;
}

2007、所有偶数的平方和以及所有奇数的立方和

给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。
Input
输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。
Output
对于每组输入数据,输出一行,应包括两个整数x和y,分别表示该段连续的整数中所有偶数的平方和以及所有奇数的立方和。
你可以认为32位整数足以保存结果。
Sample Input

1 3
2 5

Sample Output

4 28
20 152

Code:
求在范围[m,n]之间的一段连续的整数中,求出他们中所有偶数的平方和以及所有奇数的立方和, 比较简单

/*在范围[m,n]之间的一段连续的整数中,求出他们中所有偶数的平方和以及所有奇数的立方和 
*/
#include<iostream>
using namespace std;
int main(){
    int m,n;
    while(cin>>m>>n){
        //考虑m>n的情况
        if(m>n){
            int t;
            t=m;
            m=n;
            n=t;
        } 
        int sum1=0,sum2=0;
        for(int i=m;i<=n;i++){
            if(i%2==0){
                sum1=sum1+i*i;
            }else{
                sum2=sum2+i*i*i;
            }
        }
        cout<<sum1<<" "<<sum2<<endl;
    }
    return 0;
} 

2008、数值统计[统计一行中正、负数的个数]

统计给定的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

Code

//统计一行中正数、负数和零的个数
#include<iostream>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        if(n==0) return 0;
        double a;
        int sum1=0,sum2=0,sum3=0;
        for(int i=0;i<n;i++){
            cin>>a; 
            if(a>0) sum1++;  //正数个数 
            else if(a<0) sum2++;  //负数个数 
            else sum3++;   //零的个数 
        }
        cout<<sum2<<" "<<sum3<<" "<<sum1<<endl; 
    }
    return 0;
} 

2009、求数列的和

数列的定义如下:
数列的第一项为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

Code
计算给定数列的前m项和,比较简单

//给定一组数列,计算数列的前m项和
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
    double n,m;
    while(cin>>n>>m){
        double sum=0;
        for(int i=0;i<m;i++){
            sum=sum+n;
            n=sqrt(n);
        }
        cout<<setiosflags(ios::fixed);
        cout<<setprecision(2)<<sum<<endl;
    }
    return 0;
} 

2010、水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如: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

Code
输出n和m范围内的水仙花数

//输出m和n范围内的水仙花数
#include<iostream>
using namespace std;
//判断n是不是水仙花数 
int shuixian(int n){
    int g=n%10;
    int s=n/10%10;
    int b=n/100%10;
    if((g*g*g+s*s*s+b*b*b)==n){
        return 1;
    }else{
        return 0;
    }
}

int main(){
    int m,n;//[100,999]
    while(cin>>m>>n){
        int num=0;
        for(int i=m;i<=n;i++){
            if(shuixian(i)==1){
                if(num==0){
                    cout<<i;
                    num++;
                }
                else{
                    cout<<" "<<i;
                    num++;
                }
            }
        }
        if(num==0){
            cout<<"no"<<endl;
        }else{
            cout<<endl;
        }
    }
} 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值