设和式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
还有其他的解法 可自行搜索 这个是我想的一种方法
#include<stdio.h>
void main()
{int j,d,n; //n项double t, s;printf("请输入整数d,n:");scanf("%d%d", &d, &n);t = 1; s = 0;for (j = 1; j <=n; j++){t = t/ 10;s = s+(1 - t) / 9 * d;}printf(" s(%d,%d)=%.8f\n", d, n, s);
}
此处《至美——C语言程序设计》一书有,也转载自https://blog.csdn.net/double_main/article/details/53404988?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160353992519725225001167%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160353992519725225001167&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-53404988.first_rank_ecpm_v3_pc_rank_v2&utm_term=%E5%90%8C%E7%A0%81%E5%B0%8F%E6%95%B0&spm=1018.2118.3001.4187
设和式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).循环设计求解;
```c#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
注意:事实上,一个简单的案例都可以拓广或引申到较为复杂的案例,而任何复杂的案例都可以追溯到一个简单的案例。
上面并没有实现8位数四舍五入,自己又续了一下。
#include<stdio.h> void main() { /* s(2016,3) = 0.2016 + 0.20162016 + 0.201620162016输入整数d,n(1 <= d,n < 3000),计算并输出和s(d,n)(四舍五入精确到小数点后八位)。*/int a, b, d, j, n;double t, s, t1;printf(" 请输入第一个数作为同码,逗号隔开,然后输入第二个数作为重复次数");scanf_s("%d,%d", &d, &n);a = d; b = 1; //计数,计算d的位数while (a > 0){b = b * 10;a = a / 10; //根据d计算b,为递推t做准备}t = s = 0;for (j = 1; j <= n; j++){t = t / b + (double)d / b; // 0.51+0.5151s += t; //求和s}t1 = 1.0;for (j = 1; j <=8; j++) //对第8位进行四舍五入 ( 啊){ t1 = t1 *10; } s = (longlong)(s * t1 + 0.5) / t1; //此处用int会超出范围出错printf(" s(%d,%d)=%0.8f\n", d, n, s); } ``````