zoukankan      html  css  js  c++  java
  • 杭电OJ之2020-2029(C语言版)

    2020. 绝对值排序

    题目

    Problem Description
    输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。
     
    
    Input
    输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 
     
    
    Output
    对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。
     
    
    Sample Input
    3 3 -4 2
    4 0 1 2 -3
    0
     
    
    Sample Output
    -4 3 2
    -3 2 1 0
    

    代码

    #include <stdio.h>
    #include <stdlib.h>
    
    int a[120];
    int main()
    {
        int n;
        while(scanf("%d", &n) != EOF)
        {
            if(n == 0)  break;
    
            for(int i=0;i < n; i++)
            {
                scanf("%d", &a[i]);
            }
    
            //冒泡排序
            for(int i=0; i < n-1; i++)
                for(int j=0; j < n-i-1; j++)
                {
                    if(abs(a[j]) < abs(a[j+1]))
                    {
                        int temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                    }
                }
    
            //打印a[i]
            for(int i = 0; i < n; i++)
            {
                if(i == n-1) {printf("%d
    ", a[i]); break;}
                printf("%d ", a[i]);
            }
        }
    
        return 0;
    }
    

    思路与总结

    重点:排序算法
    冒泡排序
    关键代码如下:
    //冒泡排序
            for(int i=0; i < n-1; i++)
                for(int j=0; j < n-i-1; j++)
                {
                    if(abs(a[j]) < abs(a[j+1]))
                    //绝对值按从大到小排列,每次冒泡最小的(即把最小的放在最后)
                    {
                        int temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                    }
                }
    

    2021. 发工资咯

    题目

    Problem Description
    财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
    这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
     
    
    Input
    输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
    n=0表示输入的结束,不做处理。
     
    
    Output
    对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
     
    
    Sample Input
    3
    1 2 3
    0
     
    
    Sample Output
    4
    

    代码

    #include<stdio.h>
    int main()
    {
        int i,j,n,t,k,s[6]={100,50,10,5,2,1};
        while(~scanf("%d",&n),n)  //逗号表达式
        {
            for(i=j=k=0;i<n;i++,j=0)
            {
                scanf("%d",&t);
                while(t)
                {
                    if(t<s[j]) j++;
                    else t-=s[j],k++;
                }
            }
            printf("%d
    ",k);
        }
        return 0;
    }
    
    

    思路与总结

    逗号表达式
    (3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14
    

    2020.

    题目

    Problem Description
    输入一个字符串,判断其是否是C的合法标识符。
     
    
    Input
    输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。
     
    
    Output
    对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出"yes",否则,输出“no”。
     
    
    Sample Input
    3
    12ajf
    fi8x_a
    ff  ai_2
     
    
    Sample Output
    no
    yes
    no
     
    
    

    代码

    #include <stdio.h>
    #include <ctype.h>
     
    int main(void)
    {
        int n;
        
        scanf("%d", &n);
        getchar();
     
        while (n--) {
            char c, flag = 1;
     
            c = getchar();
     
            if (!(isalpha(c) || c == '_'))
                flag = 0;
     
            while ((c = getchar()) != '
    ') {
                if (!(isalnum(c) || c == '_'))
                    flag = 0;
            }
     
            printf("%s
    ", flag ? "yes" : "no");
        }
     
        return 0;
    }
    

    思路与总结

    按照字符流来处理,好好消化!
    标识符输入结束判断语句:c = getchar()) != '
    '
    

    2025. 查找最大元素

    题目

    Problem Description
    对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
     
    
    Input
    输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
     
    
    Output
    对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入"(max)"。
     
    
    Sample Input
    abcdefgfedcba
    xxxxx
     
    
    Sample Output
    abcdefg(max)fedcba
    x(max)x(max)x(max)x(max)x(max)
    

    代码

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	char max,str[101];
    	int len,i;
    	while(~scanf("%s",str))
    	{
    		len=strlen(str);
    		max='a';
    		for(i=0;i<=len-1;i++)
    		{
    			if(str[i]>max)
    			{
    				max=str[i];
    			}
    		}
    		for(i=0;i<=len-1;i++)
    		{
    			printf("%c",str[i]);
    			if(str[i]==max)
    			{
    				printf("(max)");
    			}
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    
    

    思路与总结

    1. 找到最大字母
    2. 在最大字母后,输出(Max)
    

    2026. 首字母便大写

    题目

    Problem Description
    输入一个英文句子,将每个单词的第一个字母改成大写字母。
     
    
    Input
    输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。
     
    
    Output
    请输出按照要求改写后的英文句子。
     
    
    Sample Input
    i like acm
    i want to get an accepted
     
    
    Sample Output
    I Like Acm
    I Want To Get An Accepted
     
    

    代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
        char a[105];
        int i,len;
        while(gets(a)!='')
        {
            len=strlen(a);
            if(a[0]!=' ')
                a[0]=a[0]-32;
            for(i=1;i<len;i++)
            {
                if(a[i]!=' '&&a[i-1]==' ')
                {
                    a[i]=a[i]-32;
                }
            }
            puts(a);
        }
        return 0;
    }
    
    

    思路与总结

    改变空格后的字母为大写,注意第一个
    
    语法知识
    gets:
    gets能够接受空格、制表符Tab和回车等;
    gets可接受回车键之前输入的所有字符,并用’’替代 ‘
    ’.回车键不会留在输入缓冲区中
    
    
    puts:
    puts()在输出字符串时会将’’自动转换成’
    ’进行输出,也就是说,puts方法输出完字符串后会自动换行。
    

    2027. 统计元音

    题目

    Problem Description
    统计每个元音字母在字符串中出现的次数。
     
    
    Input
    输入数据首先包括一个整数n,表示测试实例的个数,然后是n行长度不超过100的字符串。
     
    
    Output
    对于每个测试实例输出5行,格式如下:
    a:num1
    e:num2
    i:num3
    o:num4
    u:num5
    多个测试实例之间由一个空行隔开。
    
    请特别注意:最后一块输出后面没有空行:)
     
    
    Sample Input
    2
    aeiou
    my name is ignatius
     
    
    Sample Output
    a:1
    e:1
    i:1
    o:1
    u:1
    
    a:2
    e:1
    i:3
    o:0
    u:1
    

    代码

    # include <stdio.h>
    # include <string.h>
    
    int main()
    {
        int n, len;
        char s[150];
        while(scanf("%d", &n) != EOF && n != 0)
        {
            getchar();
            while(n--)
            {
                gets(s);
                int a_count = 0;int e_count = 0;int i_count = 0;int o_count = 0;int u_count = 0;
                len = strlen(s);
                for(int i=0;i < len; i++)
                {
                    if(s[i] == 'a') a_count += 1;
                    if(s[i] == 'e') e_count += 1;
                    if(s[i] == 'i') i_count += 1;
                    if(s[i] == 'o') o_count += 1;
                    if(s[i] == 'u') u_count += 1;
                }
                printf("a:%d
    ", a_count);
                printf("e:%d
    ", e_count);
                printf("i:%d
    ", i_count);
                printf("o:%d
    ", o_count);
                printf("u:%d
    ", u_count);
                if(n)   printf("
    ");
    
            }
        }
        return 0;
    }
    

    思路与总结

    在做字符类型题目,注意scanf会引入一个'
    '换行符,必要时用getchar()吸收。
    

    2028. Lowest Common Multiple Plus(最小公倍数)

    题目

    Problem Description
    求n个数的最小公倍数。
     
    
    Input
    输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
     
    
    Output
    为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
     
    
    Sample Input
    2 4 6
    3 2 5 7
     
    
    Sample Output
    12
    70
    

    代码

    //最小公倍数 = 两整数 / 最大公约数
    #include <stdio.h>
    int gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }
    int lcm(int a,int b)
    {
        return a*b/gcd(a,b);
    }
    int main()
    {
        int a[100],n;
        while(scanf("%d",&n)==1)
        {
            int i,y=1;
            for(i=0;i<n;i++)
                scanf("%d",&a[i]);
                
            //转换成两个比较,比较n-1轮
            for(i=0;i<n-1;i++)
            {
                a[i+1]=lcm(a[i],a[i+1]);
            }
            printf("%d
    ",a[i]);
        }
    
        return 0;
    }
    

    思路与总结

    //最小公倍数 = 两整数 / 最大公约数
    
    最大公约数(辗转相除法)--递归 重点
    int gcd(int a,int b)
    {
        return b==0?a:gcd(b,a%b);
    }
    

    2020. Palindromes _easy version(回文串)

    题目

    Problem Description
    “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
     
    
    Input
    输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。
     
    
    Output
    如果一个字符串是回文串,则输出"yes",否则输出"no".
     
    
    Sample Input
    4
    level
    abcde
    noon
    haha
     
    
    Sample Output
    yes
    no
    yes
    no
    
    

    代码

    /* HDU2029 Palindromes _easy version */
     
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
        int n, flag, start, end;
        char a[4096];
     
        scanf("%d", &n);
        while(n--) {
            // 读入字符串
            scanf("%s", a);
     
            // 判断是否为回文
            start = 0;
            end = strlen(a) - 1;
            flag = 1;
            while(start < end) {
                if(a[end] != a[start]) {
                    flag = 0;
                    break;
                }
                start++;
                end--;
            }
     
            // 输出结果
            if(flag)
                printf("yes
    ");
            else
                printf("no
    ");
        }
     
        return 0;
    }
    
    

    思路与总结

    判断回文,按照题意来就行
    
  • 相关阅读:
    Flink-Record
    Linux Performance Observaibilty Tools
    DEC-UPDATE
    经济与选择(持续更新)
    GIS操作汇集(更新)
    JULY-Record-update
    GO (待更新)
    Python打包分发工具setuptools简介(转)
    HashMap源码分析
    nginx配置负载均衡
  • 原文地址:https://www.cnblogs.com/wemo/p/10413925.html
Copyright © 2011-2022 走看看