• 《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
",a);
            break;
        }
        if(abs(right)<1E-6)
        {
            printf("%.2lf
",b);
            break;
        }
        if(abs(mid)<1E-6)
        {
            printf("%.2lf
",(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
",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
",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
",res);
    else
        printf("ERROR
");
    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
",s1);
    if(s1<s2)
         printf("^_^ %d
",s2);
    if(s1==s2)
        printf("-_- %d
",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
");
        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("
");
        return;
    }
}
int main()
{
    int j;
    scanf("%d%d",&m,&n);
    for(j=m;j<=n;j++)
        number(j);
    return 0;
}

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

  • 相关阅读:
    设置C#Web网页Session超时丢失时间
    docker19.03限制容器使用的cpu资源
    centos8平台搭建mysql8数据库主从同步
    centos8平台使用slabtop监控slab内存的状态
    centos8上使用lsblk查看块设备
    centos8环境判断当前操作系统是否虚拟机或容器
    centos8平台使用lscpu查看cpu信息
    centos8平台使用pidstat监控cpu/内存/io
    docker19.03使用数据卷
    testng对失败时截图处理
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965355.html
  • Copyright © 2020-2023  润新知