程序设计大赛题目解答.doc
文本预览下载声明
程序设计大赛题目解答
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瓶
显示全部