《C/C++/Java/Pascal 程序设计基础》习题集 解题2
题目链接: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\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)
水仙花数是指一个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\n",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\n",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\n",res); else printf("ERROR\n"); 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\n",s1); if(s1<s2) printf("^_^ %d\n",s2); if(s1==s2) printf("-_- %d\n",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\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) 编辑 收藏 举报