天天看点

HDU-#1062、1064、1170、1197、1720、2104、2629、2734 HDU水题系列(英文题)(四)

       接着前三个HDU水题系列,这里给出第四个水题系列,该系列的题全是英文题,可以作为入门练习的专题。本系列一共八道题,题号分别为:1062、1064、1170、1197、1720、2104、2629、2734。对应的题解如下:

       #1062 :Text Reverse

      题目大意:输入一行句子,该句子中的每个单词是颠倒的,以空格分割,将每个单词翻转过来!

      解题思路:该题有几种写法,最容易想到的就是以空格为分割,用数组或者用栈(先进后出的原理很类似)来进行输入和输出。这里直接采取遍历空格,再将空格前的单词逆序输出,详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1062

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 1000+10;
char str[MAXN];
int t;

int main(){
    scanf("%d",&t);
    getchar();
    while(t--){
        gets(str);
        int len=strlen(str);
        int k=0,j;
        for(int i=0;i<len;i++){ //遍历整个句子,有空格做分割
            if(str[i]==' '){
                for(j=i-1;j>=k;j--) //逆序输出
                    printf("%c",str[j]);
                printf(" ");
                k=i+1; //控制下标
            }
        }
        if(j!=len-1){ //最后一个单词的输出
            for(int j=len-1;j>k-1;j--)
                printf("%c",str[j]);
            printf("\n");
        }
    }
    return 0;
}
           

      #1064:Financial Management

      题目大意:就是根据每月的余额,求一年平均每月的MM。

      解题思路:这个就没有思路了,下意识就是求和再求平均即可,详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1064

     code:

#include <iostream>
#include <cstdio>
using namespace std;

double num,ans;

int main(){
    for(int i=0;i<12;i++){
        scanf("%lf",&num);
        ans+=num;
    }
    printf("$%.2lf\n",ans/12);
    return 0;
}
           

      #1170:Balloon Comes!

      题目大意:给出计算符号,以及要计算的两个数。求计算结果。

      解题思路:就是模拟一个简易的计算器。这里要注意输出的条件限制。当结果为整数则输出整数,否则保留小数点后两位。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1170

     code:

#include <iostream>
#include <cstdio>
using namespace std;

int t;
int a,b;
char opr;

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%s %d %d",&opr,&a,&b);
        switch(opr){
            case '+': printf("%d\n",a+b);break;
            case '-': printf("%d\n",a-b);break;
            case '*': printf("%d\n",a*b);break;
            case '/': if(a%b!=0) printf("%.2f\n",1.0*a/b);
                        else printf("%d\n",a/b);
                        break;
        }
    }
    return 0;
}
           

      #1197:Specialized Four-Digit Numbers

      题目大意:判断四位数内,其十进制、十二进制、十六进制的数各个数位上的数之和相等的数。

      解题思路:直接打表,将所有四位数的这三个进制一一判断是否相等,相等就标记,然后直接输出即可。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1197

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 10000;
int qnum[MAXN];

int Binary(int n,int r){
    int ans=0;
    while(n){
        ans+=n%r;
        n/=r;
    }
    return ans;
}

void init(){
    memset(qnum,0,sizeof(qnum));
    for(int i=1000;i<=9999;i++)
        if(Binary(i,10)==Binary(i,12) && Binary(i,10)==Binary(i,16)) qnum[i]=1;
}

int main(){
    init();
    for(int i=1000;i<=9999;i++)
        if(qnum[i]==1) printf("%d\n",i);
    return 0;
}
           

      #1720:A+B Coming

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1720

     解题报告:http://blog.csdn.net/qinlumoyan/article/details/39010923

      #2104:hide handkerchief

      题目大意:做一个丢手绢的游戏,给出N个盒子,以及打开的间隔数M,问是否能够最终找到。其中,每次寻找都按照间隔M-1数进行寻找。

      解题思路:直接简单推一下前面几个数既可以发现一个规律,如果N和M之间不存在大于1的约数,则会找到,反之找不到。因此该问题就转化为求最大公约数的问题了!然后直接GCD搞定,详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2104

     code:

#include <iostream>
#include <cstdio>
using namespace std;

int n,m;

int gcd(int x,int y){
    if(!x || !y) return x>y?x:y;
    for(int t;t=x%y;x=y,y=t);
    return y;
}

int main(){
    while(scanf("%d%d",&n,&m)!=EOF && n!=-1 && m!=-1){
        if(gcd(n,m)==1) printf("YES\n");
        else printf("POOR Haha\n");
    }
    return 0;
}
           

      #2629:Identity Card

      题目大意:给出身份证号,判断这个ID号是属于哪个省份以及其对应的出生年月日是多少?

      解题思路:直接根据给定的省份编码,由特征可先将省份编码进行转换,然后直接输出对应位即可,详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2629

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 18;
int n,zip;
char num[MAXN];
string home;

int main(){
    scanf("%d",&n);
    getchar();
    while(n--){
        gets(num);
        zip=(num[0]-'0')*10+num[1]-'0';
        switch(zip){
            case 33: home="Zhejiang";break;
            case 11: home="Beijing";break;
            case 71: home="Taiwan";break;
            case 81: home="Hong Kong";break;
            case 54: home="Tibet";break;
            case 82: home="Macao";break;
            case 21: home="Liaoning";break;
            case 31: home="Shanghai";break;
            default: break;
        }
        cout<<"He/She is from "<<home<<",and his/her birthday is on "<<num[10]<<num[11]<<","<<num[12]<<num[13]<<","<<num[6]<<num[7]<<num[8]<<num[9]<<" based on the table."<<endl;
    }
    return 0;
}
           

      #2734:Quicksum

      题目大意:求输入句子的和,该和定义为由下标乘以对应大写字母的序号。其中空格序号为0.

      解题思路:直接进行模拟即可,当遇到空格不处理,然后遍历一边即可。详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2734

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 255+1;
char str[MAXN];
int sum;

int idx(char c){return c-'A'+1;}

int main(){
    while(gets(str) && str[0]!='#'){
        int len = strlen(str);
        sum=0;
        for(int i=1;i<=len;i++)
            if(str[i-1]!=' ') sum+=i*idx(str[i-1]);
        printf("%d\n",sum);
    }
    return 0;
}