题目链接:http://www.patest.cn/contests/basic-programming ,总体说来都是基础题,节省时间,只做了分值20的题目。
解题1链接:http://blog.csdn.net/wyh7280/article/details/47123547
循环-08. 二分法求多项式单根(20)
二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。
二分法的步骤为:
本题目要求编写程序,计算给定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)
水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例 如:153 = 13 + 53+ 33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:3
输出样例:
153
370
371
407
#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)
本题要求统计给定整数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)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,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)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进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)
所谓完数就是该数恰好等于除自身外的因子之和。例如: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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。