ACM练习总结(一)

ACM练习(一)

密码问题

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.

例如,字母"A"后面第4个字母是"E".“E"代替"A”。因此,“China"应译为"Glmre”。

请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。

#include
int main()
{
    char ch1,ch2,ch3,ch4,ch5;
    scanf("%c",&ch1);
    scanf("%c",&ch2);
    scanf("%c",&ch3);
    scanf("%c",&ch4);
    scanf("%c",&ch5);
    printf("%c%c%c%c%c",ch1+4,ch2+4,ch3+4,ch4+4,ch5+4);
    return 0;
}

母牛问题–简单递归

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

这个题目挺有意思的,我主要用了“斐波那契数列”的知识来解答的,但是发现了问题。

1、我用了函数递归来解题,导致时间超时,问题是由于每次解答一题要递归好几次。

2、题目中的 0
#include
#define N 55
int monther_cow[N];
void monther_cow2(int n);
 
int main()
{
   int input[N];
   monther_cow2(N);
   int i = 0;
    do
    {
        scanf("%d",&input[i]);
    }while(input[i++] != 0);
 
    for(int j = 0 ; j < i-1 ; j++)
    {
        if( input[j] < 4)
        {
            printf("%d\n",monther_cow[input[j]]);
        }
         
        else
        {
            printf("%d\n",monther_cow[input[j] - 1] + monther_cow[input[j] - 3] );
        }      
    }
    return 0;
}
 
void monther_cow2(int n)//记录的斐波那契数列中对应的规律到数列
{
    int i;
    for(i = 1 ; i <= n ; i++)
    {
        if( i < 4)
        {
            monther_cow[i] = i;
        }
        else
        {
            monther_cow[i] = monther_cow[i - 1] + monther_cow[i - 3];
        }
        
    }
}

字符串分类统计

输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

解一

#include
int main()
{
    int letter = 0,number = 0,blank = 0,others = 0,c;        //分别为字母、数字、空格、其他
    while((c = getchar()) != '\n'){
        if(c >= 'A' && c<='Z' || c >= 'a' && c <= 'z')    //判断是否为字母
            letter++;
        else if(c >= '0' && c <= '9')                     //判断是都为数字
            number++;
        else if(c == ' ')                                 //判断是否为空格
            blank++;
        else                                              //其他
            others++;
    }
    printf("%d %d %d %d\n",letter,number,blank,others);
    return 0;
}

解二

scanf()和gets()都可以用来从标准输入接收一个字符串,区别如下:

get()函数:

1)gets()从标准输入设备读取字符串,以回车结束读取,使用’\0’结尾,回车符’\n’被舍弃没有遗留在缓冲区。

2)可以用来输入带空格的字符串。

3)可以无限读取,不会判断上限,因此使用gets不安全,可能会造成溢出。

scanf()函数:

1)scanf()以 空格 或 回车符 结束读取,空格 或 回车符 会遗留在缓冲区。

2)不能直接输入带空格的字符串。

注意:scanf()函数如何才能输入带空格的字符串。

scanf("%[^\n]", a);  //%[]输入字符集, [^\n] 表示除了'\n'之外的字符都接收,即可以接收空格,这个可以用来输入带空格的字符串。
#include 
#include 
 
#define MAX 256
 
int main()
{
    char str[MAX];
 
    //1 用gets函数接收从标准输入中输入的字符串
    //gets(str);
    //2 用scanf接收一个字符串,下列方式可以接收空格
    scanf("%[^\n]", str);
 
    int len = strlen(str);
    int i;
    int num = 0;
    int abc = 0;
    int space = 0;
    int other = 0;
    for (i = 0; i < len; i++)
    {
        if (str[i] <= '9' && str[i] >= '0')
            num++;
        else if (str[i] <= 'z' && str[i] >= 'a')
            abc++;
        else if (str[i] == ' ')
            space++;
        else
            other++;
    }
 
    printf("%d %d %d %d\n", abc, num, space, other);
 
    return 0;
}

立体几何

题目描述
设圆半径r,圆柱高h 求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。 用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字**(四舍五入)**。请编程序。 PI=3.14
注意四舍五入,第一次做时被坑了。

#include
int main()
{
   float r,h;
    scanf("%f %f",&r,&h);
   float C1,Sa,Sb,Va,Vb;
   C1=float(int(3.14*(2*r)*100))/100;//可以不加float,但是我的编译器没通过
   Sa=float(int(3.14*(r*r)*100))/100;
   Sb=float(int(4*3.14*(r*r)*100))/100;
   Va=float(int(1.333334*3.14*(r*r*r)*100))/100;
   Vb=float(int(h*3.14*(r*r)*100))/100;
   printf("C1=%0.2f\n",C1);
   printf("Sa=%0.2f\n",Sa);
   printf("Sb=%0.2f\n",Sb);
   printf("Va=%0.2f\n",Va);
   printf("Vb=%0.2f\n",Vb);
}

对比发现,学校的OJ真是,哎…一言难尽。
建议初学者使用这个
C语言网
https://www.dotcpp.com/oj/problemset.html
(全中文界面,比较友好。题目较易。讨论板块有许多优质题解。不过缺点是我们学校不认。。。)
其他著名高校OJ
POJ: poj.org

CodeForces: codeforces.com

HDUOJ: acm.hdu.edu.cn

VJudge: vjudge.net

ZOJ: acm.zju.edu.cn

UVA: uva.onlinejudge.org

你可能感兴趣的:(ACM练习总结(一))