设和式s(d,n)=0.d+0.dd+0.ddd+...+0.dd...d为n项同码d小数之和,其中第k项小数点后有连续k个数字d(d=1,2,...,9)。
例如:s(7,4)=0.7+0.77+0.777+0.7777
1.说明:
输入整数d,n(1<=d<=9,1<n<3000),计算并输出同码小数和s(d,n)(四舍五入精确到小数点后八位);
设置双精度实变量s实施累加求和;
设置i(1~n)循环枚举和式的每一项,设前项小数为t,则当前项显然应为:t=t/10+(double)d/10
2.程序设计:
(1).循环设计求解;
#include<stdio.h>
void main()
{
int i,d,n;
double s,t;
printf("请输入两个整数d,n:");
scanf("%d,%d",&d,&n);
s=t=0; /*t,s清零*/
for(i=1;i<=n;i++)
{
t=t/10+(double)d/10; /*t为第i项小数*/
s+=t; /*求和s*/
}
printf("s(%d,%d)=%.8f\n",d,n,s); /*按公式输出和s*/
getch();
}
(2).省略循环设计求解;
#include<stdio.h>
void main()
{
int d,n;
double s;
printf("请输入两个整数d,n:");
scanf("%d,%d",&d,&n);
s=(n-0.111111111)*d/9; /*因输出精确到小数点后八位,可取至小数点后九位*/
printf("s(%d,%d)=%.8f\n",d,n,s);
getch();
}
(3).拓广到任意指定同码;
例如:s(2016,3)=0.2016+0.20162016+0.201620162016
输入整数d,n(1<=d,n<3000),计算并输出和s(d,n)(四舍五入精确到小数点后八位)。
#include<stdio.h>
void main()
{
int a,b,d,i,n;
double t,s;
printf("请输入两个整数d,n:");
scanf("%d,%d",&d,&n);
a=d;
b=1;
while(a>0)
{b*=10;a/=10;} /*根据d计算b*/
t=s=0;
for(i=1;i<=n;i++)
{
t=t/b+(double)d/b; /*强制类型转换*/
s+=t;
}
printf("s(%d,%d)=%.8f\n",d,n,s);
getch();
}
3.程序运行示例及注意事项;
(1),(2)程序:请输入两个整数d,n:7,2017
s(7,2017)=1568.69135802
(3)程序:请输入两个整数d,n:2017,1000
s(2017,1000)=201.72015184
注意:事实上,一个简单的案例都可以拓广或引申到较为复杂的案例,而任何复杂的案例都可以追溯到一个简单的案例。