中国大学MOOC-翁恺-C语言程序设计习题集 05-0 到 06-3

05-0. 求序列前N项和(15)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
张彤彧(浙江大学)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后2位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66
程序:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N;
    while(scanf("%d",&N)==1)
    {
        double a=2,b=1;
        double sum=0.0;
        for(int i=1;i<=N;i++)
        {
            sum+=a*1.0/b;
            a=a+b;
            b=a-b;
        }
        printf("%.2lf
",sum);
    }
}

05-1. 约分最简分式(15)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
翁恺(浙江大学)

分数可以表示为“分子/分母”的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠“/”分隔,如: 12/34 表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。

提示:在scanf的格式字符串中加入“/”,让scanf来处理这个斜杠。

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用“分子/分母”的形式表示分数。如 5/6表示6分之5。

输入样例:
60/120
输出样例:
1/2
代码:

#include<stdio.h>
#include<stdlib.h>
int Div(int n,int m)
{
    if(n<m)
    {
        int temp=n;
        n=m;
        m=temp;
    }
    int rem=n%m;
    while(rem)
    {
        n=m;
        m=rem;
        rem=n%m;
    }
    return m;
}
int main()
{
    int n,m;
    char c;
    while(scanf("%d%c%d",&n,&c,&m)==3)
    {
        int div=Div(n,m);
        printf("%d/%d
",n/div,m/div);
    }
}

05-2. 念数字(15)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
翁恺(浙江大学)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出“fu”字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:

输入在一行中给出一个整数,如: 1234 。

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si

输入样例:
-600
输出样例:
fu liu ling ling
代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char num[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        int flag=0;
        if(n<0)
        {
            printf("fu");
            n=-n;
            flag=1;
        }
        char a[100];
        sprintf(a,"%d",n);
        for(int i=0;i<strlen(a);i++)
        {
            if(flag==1)
            {
                printf(" %s",num[a[i]-48]);
            }
            if(flag==0)
            {
                 flag=1;
                 printf("%s",num[a[i]-48]);
            }
        }
        printf("
");
    }
}

05-3. 求a的连续和(15)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
翁恺(浙江大学)

输入两个整数a和n,a的范围是[0,9],n的范围是[1,8],求数列之和S = a+aa+aaa+...+aaa...a(n个a)。 如a为2、n为8时输出的是2+22+222+...+22222222的和。

输入格式:

输入在一行中给出两个整数,先后表示a和n。

输出格式:

在一行中输出要求的数列之和。

输入样例:
2 4
输出样例:
2468
代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int a,n;
    while(scanf("%d%d",&a,&n)==2)
    {
        int i,d=a*n,temp=0;
        int arr[100];
        for(i=0;i<n;i++)
        {
            d=a*(n-i)+temp;
            arr[i]=d%10;
            temp=d/10;
        }
        long long sum=0,pro=1;
        for(i=0;i<n;i++)
        {
            sum+=arr[i]*pro;
            pro*=10;
        }
        if(temp!=0)
            printf("%d",temp);
        printf("%lld
",sum);
    }
    return 0;
}

06-0. 混合类型数据格式化输入(5)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
乔林(清华大学)

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。

输入格式:

输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。

输出格式:

在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。

输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70
代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    double d1,d2;
    int i;
    char c,c1,c2;
    while(scanf("%lf%d%c%c%c%lf",&d1,&i,&c1,&c,&c2,&d2)==6)
    {
        printf("%c %d %.2lf %.2lf
",c,i,d1,d2);
    }
    return 0;
}

06-1. 简单计算器(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
张彤彧(浙江大学)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,4种运算符的优先级相同,按从左到右的顺序计算。

输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:
1+2*10-10/2=
输出样例:
10

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int a[10000];
    char b[10000];
    int i,num,c,cnt1=0,cnt2=0,flag=1;
    do
    {
        scanf("%d%c",&num,&c);
        a[cnt1++]=num;
        b[cnt2++]=c;
    }while(c!='=');
    int res=a[0],j=0;
    for(i=1;i<cnt1;i++)
    {
        j=i-1;
        if(b[j]!='+'&&b[j]!='-'&&b[j]!='*'&&b[j]!='/')
        {
            flag=0;
            break;
        }
        if(b[j]=='*')
        {
            res*=a[i];
        }
        else if(b[j]=='-')
        {
            res-=a[i];
        }
        else if(b[j]=='/')
        {
            if(a[i]==0)
            {
                flag=0;
                break;
            }
            res/=a[i];
        }
        else if(b[j]=='+')
        {
            res+=a[i];
        }
    }
    if(flag==0)
        printf("ERROR
");
    else
        printf("%d
",res);
}


06-2. 字符串字母大小写转换(10)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
张彤彧(浙江大学)

输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。

输入格式:

输入在一行中给出一个长度不超过40的、以#结束的非空字符串。

输出格式:

在一行中按照要求输出转换后的字符串。

输入样例:
Hello World! 123#
输出样例:
hELLO wORLD! 123
代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char a[100];
    char ch;
    int cnt=0,i;
    do
    {
        scanf("%c",&ch);
        a[cnt++]=ch;
    }while(ch!='#');
    for(i=0;i<cnt-1;i++)
    {
        if(a[i]>='A'&&a[i]<='Z')
        {
            a[i]=a[i]+32;
            continue;
        }
        if(a[i]>='a'&&a[i]<='z')
        {
            a[i]=a[i]-32;
            continue;
        }
    }
    for(i=0;i<cnt-1;i++)
        printf("%c",a[i]);
    printf("
");
}


06-3. 单词长度(15)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
翁恺(浙江大学)

你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格;最后的‘.’不计算在内。

输入格式:

输入在一行中给出一行文本,以‘.’结束。

提示:用scanf("%c",...);来读入一个字符,直到读到‘.’为止。

输出格式:

在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

输入样例:

It's great to see you here.

输出样例:

4 5 2 3 3 4
代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char a[100000];
    char ch;
    int cnt=0,i,j;
    scanf("%c",&ch);
    while(ch!='.')
    {
        a[cnt++]=ch;
        scanf("%c",&ch);
    }
    int len=strlen(a);
    int lea[1000],t=0;
    for(i=0;i<len;i++)
    {
        if(a[i]!=' ')
        {
            j=i+1;
            while(a[j]!=' '&&j<len)
            {
                j++;
            }
            lea[t++]=j-i;
            i=j;
        }
    }
    for(i=0;i<t;i++)
    {
        if(i==0)
            printf("%d",lea[0]);
        else
            printf(" %d",lea[i]);
    }
    printf("
");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965270.html