C语言-同码小数和

设和式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.5151
        s += 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);   } ``````

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值