文档详情

程序设计大赛题目解答.doc

发布:2017-10-02约2.2万字共25页下载文档
文本预览下载声明
程序设计大赛题目解答 1. 求代数和 设n为正整数,求和 式中各项符号为二正一负,分母符号为一正一负。 正整数n从键盘输入,输出和s四舍五入精确到小数点后5位。 输入n=100 输出: 输入n=2011 输出: ? // 求代数和 #include stdio.h #includemath.h void main() { long j,n; double ts,s; printf( 请输入n: ); scanf(%d,n); j=0;ts=0;s=0; while(jn) { j=j+1; if(j%2==0) ts=ts-(double)1/j; // ts为各项的分母 else ts=ts+(double)1/j; if(j%3==0) s=s-sqrt(j)/ts; // 求代数和s else s=s+sqrt(j)/ts; } printf( s=%.5f \n,s); } ? 请输入n: 100 s=324.74013 请输入n: 2011 s=28924.48725 ? 变通:设2n≤2011,当n为何值时,和s最接近2011? #includestdio.h #includemath.h void main() { int n,n1=1; double sum1=1,sum2=1,g; printf(请输入n:); scanf(%d,n); while(n1n) { n1++; if(n1%2==0) sum2+=-(double)1/n1; else sum2+=(double)1/n1; g=sqrt(n1); if(n1%3==0) sum1+=-g/sum2; else sum1+=g/sum2; } printf(%lf\n,sum1); }? 2. 幂积序列 设x,y为非负整数,试计算集合 的元素不大于指定整数n的个数k,并求这些元素从小到大排序的第m项f。 输入n,m, 输出k,f。 ? n=10000,m=50 输出: nm=100 输出: ? ? 幂积序列复杂在“积”字上,即幂积序列的项既可以是2的幂,3的幂,也可以是这双幂的乘积。 我们应用枚举求解。 (1)设计要点 集合元素由2的幂与3的幂及其乘积组成,设元素从小到大排序的第k项为f(k)。显然,f(1)=1,f(2)=2。 设置a循环,a从3开始递增1至n,对每一个a(赋值给j),逐次试用2试商,然后逐次试用3试商。 试商后若j1,说明原a有2,3以外的因数,不属于该序列。 若j=1,说明原a只有2,3的因数,属于该序列,把a赋值给序列第k项。 由于实施从小到大测试赋值,所得项无疑是从小到大的序列。 当a达到指定的n,退出循环,输出指定项f(m)。 (2) 枚举程序设计 // 幂序列2^x*3^y枚举求解 #include stdio.h void main() {int k,m; long a,j,n,f[1000]; printf( 计算不大于n的项数,请指定n: ); scanf(%ld,n); printf( 输出序列的第m项,请指定m: ); scanf(%d,m); f[1]=1;f[2]=2;k=2; for(a=3;a=n;a++) { j=a; while(j%2==0) j=j/2; // 反复用2试商 while(j%3==0) j=j/3; // 反复用3试商 if(j==1) { k++;f[k]=a;} // 用a给f[k]赋值 } printf( 幂序列中不大于%ld的项数为:%d\n,n,k); if(m=k) printf( 从小到大排序的第%d项为:%ld\n,m,f[m]); else printf( 所输序号m大于序列的项数!\n); } (3) 程序运行示例 n=10000,m=50 输出: 67, 2304 nm=100 输出:190, 93312 ? 变通: 计算集合在指定区间[n1,n2]中有多少个元素? ? 3. 喝汽水 定价 1瓶汽水4角8分钱,同时规定3个空瓶可换回1瓶汽水,或20个空瓶可换回7瓶汽水。 例如用5元买10瓶汽水,然后用9个空瓶子换3瓶汽水,喝掉3瓶
显示全部
相似文档