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

来源:互联网 发布:移动网络怎么样 编辑:程序博客网 时间:2024/05/21 21:34

题目链接: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
    输出样例:
    153370371407
    代码:想节省时间的话可以直接对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 = 16 = 1 + 2 + 328 = 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;}

    0 0
    原创粉丝点击