《C/C++/Java/Pascal 程序设计基础》习题集 解题2

题目链接:http://www.patest.cn/contests/basic-programming ,总体说来都是基础题,节省时间,只做了分值20的题目。
解题1链接:http://blog.csdn.net/wyh7280/article/details/47123547

循环-08. 二分法求多项式单根(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
杨起帆(浙江大学城市学院)

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

  • 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
  • 如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
  • 如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
  • 如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2, b],令a=(a+b)/2,重复循环;
  • 如果f((a+b)/2)与f(b)同号,则说明根在区间[a, (a+b)/2],令b=(a+b)/2,重复循环;

    本题目要求编写程序,计算给定3阶多项式f(x)=a3x3+a2x2+a1x+a0在给定区间[a, b]内的根。

    输入格式:

    输入在第1行中顺序给出多项式的4个系数a3、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

    输出格式:

    在一行中输出该多项式在该区间内的根,精确到小数点后2位。

    输入样例:
    3 -1 -3 1
    -0.5 0.5
    
    输出样例:
    0.33
  • 代码:

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    
    int main()
    {
        double a3,a2,a1,a0;
        scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);
        double a,b;
        scanf("%lf%lf",&a,&b);
        double left,right,mid;
        do
        {
            left=a3*pow(a,3)+a2*pow(a,2)+a1*pow(a,1)+a0;
            right=a3*pow(b,3)+a2*pow(b,2)+a1*pow(b,1)+a0;
            mid=a3*pow((a+b)/2,3)+a2*pow((a+b)/2,2)+a1*pow((a+b)/2,1)+a0;
            if(abs(left)<1E-6)
            {
                printf("%.2lf\n",a);
                break;
            }
            if(abs(right)<1E-6)
            {
                printf("%.2lf\n",b);
                break;
            }
            if(abs(mid)<1E-6)
            {
                printf("%.2lf\n",(a+b)/2);
                break;
            }
            if(mid*left>0)  a=(a+b)/2;
            if(mid*right>0) b=(a+b)/2;
        }while(left*right<0);
    }
    

    循环-11. 水仙花数(20)

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

    水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例 如:153 = 13 + 53+ 33。 本题要求编写程序,计算所有N位水仙花数。

    输入格式:

    输入在一行中给出一个正整数N(3<=N<=7)。

    输出格式:

    按递增顺序输出所有N位水仙花数,每个数字占一行。

    输入样例:
    3
    
    输出样例:
    153
    370
    371
    407
    代码:想节省时间的话可以直接对N=6和N=7的输入情况进行if匹配。

    #include<iostream>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    int N;
    int pow(int n,int k)
    {
        int pro=1;
        for(int i=1;i<=k;i++)
            pro*=n;
        return pro;
    }
    
    bool equal(int n)
    {
        int cnt=0,a[10],temp=n;
        memset(a,0,sizeof(a));
        while(temp)
        {
            a[cnt++]=temp%10;
            temp/=10;
        }
        ll sum=0;
        for(int i=0;i<cnt;i++)
        {
            sum+=pow(a[i],N);
        }
        return (sum==n);
    }
    
    int main()
    {
        cin>>N;
        int left,right;
        left=pow(10,N-1);
        right=left*10;
        for(int i=left;i<right;i++)
        {
            if(equal(i))
            {
                printf("%d\n",i);
            }
        }
    }
    


    循环-15. 统计素数并求和(20)

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

    本题要求统计给定整数M和N区间内素数的个数并对它们求和。

    输入格式:

    输入在一行中给出2个正整数M和N(1<=M<=N<=500)。

    输出格式:

    在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

    输入样例:
    10 31
    
    输出样例:
    7 143
    代码:

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    using namespace std;
    bool prime(int n)
    {
        if(n==1) return false;
        if(n==2) return true;
        int k=floor(sqrt(n)+0.5);
        for(int i=2;i<=k;i++)
        {
            if(n%i==0)
                return false;
        }
        return true;
    }
    int main()
    {
        int m,n,cnt=0,sum=0;
        cin>>m>>n;
        for(int i=m;i<=n;i++)
        {
            if(prime(i))
            {
                cnt++;
                sum+=i;
            }
        }
        printf("%d %d\n",cnt,sum);
    }


    循环-17. 简单计算器(20)

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

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

    输入格式:

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

    输出格式:

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

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

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    using namespace std;
    int a[10000];
    char b[10000];
    int main()
    {
        int t1;
        char t2;
        int cnt=0;
        do
        {
            scanf("%d%c",&t1,&t2);
            a[cnt]=t1;
            b[cnt]=t2;
            cnt++;
        }while(t2!='=');
        int res=a[0],flag=1;
    
        for(int i=0;i<cnt;i++)
        {
            if(b[i]!='+'&&b[i]!='-'&&b[i]!='/'&&b[i]!='*'&&b[i]!='=')
            {
                flag=0;
                break;
            }
            if(b[i]=='+')
            {
                res+=a[i+1];
            }
            if(b[i]=='-')
            {
                res-=a[i+1];
            }
            if(b[i]=='*')
            {
                res*=a[i+1];
            }
            if(b[i]=='/')
            {
                if(a[i+1]==0)
                {
                    flag=0;
                    break;
                }
                else
                    res/=a[i+1];
            }
        }
        if(flag==1)
            printf("%d\n",res);
        else
            printf("ERROR\n");
        return 0;
    }

    循环-18. 龟兔赛跑(20)

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

    乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

    输入格式:

    输入在一行中给出比赛时间T(分钟)。

    输出格式:

    在一行中输出比赛的结果:乌龟赢输出“@_@”,兔子赢输出“^_^”,平局则输出“-_-”;后跟1空格,再输出胜利者跑完的距离。

    输入样例:
    242
    
    输出样例:
    @_@ 726
    代码:

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int main()
    {
        int T=0,t=0;
        cin>>T;  //time
        int s1=0,s2=0; //distance
        while(t<T)
        {
            t++;
            s1=3*t;
            s2+=9;
            if(t%10==0&&s2>s1&&t<T)
            {
                t+=30;
                s1=3*t;
            }
        }
        s1=3*T;
        if(s1>s2)
            printf("@_@ %d\n",s1);
        if(s1<s2)
             printf("^_^ %d\n",s2);
        if(s1==s2)
            printf("-_- %d\n",s1);
    }

    循环-23. 找完数(20)

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈建海(浙江大学)
    来源
    ZOJ

    所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

    输入格式:

    输入在一行中给出2个正整数m和n(0<m<=n<=10000),中间以空格分隔。

    输出格式:

    逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。

    输入样例:

    1 30
    

    输出样例:

    1 = 1
    6 = 1 + 2 + 3
    28 = 1 + 2 + 4 + 7 + 14
    代码:

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int m,n;
    void number(int cu)
    {
        int i,cnt=0,a[10000+1],sum=0;
        if(cu==1)
        {
            printf("1 = 1\n");
            return;
        }
        int k=floor(sqrt(cu)+0.5);
        for(i=1;i<=k;i++)
        {
            if(cu%i==0)
            {
                a[cnt++]=i;
                sum+=i;
                if(cu%(cu/i)==0&&i<(cu/i)&&i!=1)
                {
                     a[cnt++]=cu/i;
                     sum+=cu/i;
                }
            }
        }
        sort(a,a+cnt);
        if(sum==cu)
        {
            printf("%d = ",cu);
            for(i=0;i<cnt;i++)
            {
                if(i==0)
                    printf("%d",a[i]);
                else
                    printf(" + %d",a[i]);
            }
            printf("\n");
            return;
        }
    }
    int main()
    {
        int j;
        scanf("%d%d",&m,&n);
        for(j=m;j<=n;j++)
            number(j);
        return 0;
    }
    

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

    posted on 2015-07-29 15:35  Tob__yuhong  阅读(530)  评论(0编辑  收藏  举报

    导航