同码小数和

    设和式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 


注意:事实上,一个简单的案例都可以拓广或引申到较为复杂的案例,而任何复杂的案例都可以追溯到一个简单的案例。



小数BCD转换为十进制数的方法可以基于整数BCD转换的基本原理进行扩展。 ### 原理 整数BCD是用4位二进制来表示一位十进制数,小数BCD也是类似的,只不过是用于表示小数部分。每4位二进制代表小数部分的一位十进制数。在转换时,需要分别处理整数部分小数部分。 ### 步骤 1. **分离整数小数部分**:将小数BCD分为整数部分小数部分。 2. **整数部分转换**:对于整数部分的BCD,按照整数BCD转换为十进制数的方法进行转换。可以使用公式 `(bcd - (bcd >> 4) * 6)` 进行转换,其中 `bcd` 是整数部分的BCD。 3. **小数部分转换**:对于小数部分的BCD样每4位一组进行处理。将每组4位二进制转换为对应的十进制数,然后根据其在小数部分的位置确定其权重,即 `10^(-n)`,其中 `n` 是该组在小数部分的位置(从1开始计数)。 4. **合并结果**:将整数部分转换后的十进制数小数部分转换后的十进制数相加,得到最终的十进制数。 ### 示例代 ```python def bcd_to_decimal(bcd): # 假设 bcd 是一个字符串,格式为 "整数部分.小数部分" parts = bcd.split('.') integer_part = int(parts[0], 16) decimal_part = int(parts[1], 16) # 整数部分转换 int_decimal = (integer_part - ((integer_part >> 4) * 6)) # 小数部分转换 decimal_value = 0 decimal_str = format(decimal_part, '04b') num_digits = len(decimal_str) // 4 for i in range(num_digits): digit = int(decimal_str[i*4:(i+1)*4], 2) decimal_value += digit * (10 ** (-i - 1)) # 合并结果 result = int_decimal + decimal_value return result # 示例 bcd_number = "12.34" # 假设这是一个小数BCD decimal_number = bcd_to_decimal(bcd_number) print(decimal_number) ``` ### 代解释 1. **分离整数小数部分**:使用 `split('.')` 方法将输入的小数BCD字符串分为整数部分小数部分。 2. **整数部分转换**:将整数部分的BCD转换为十进制数,使用公式 `(integer_part - ((integer_part >> 4) * 6))`。 3. **小数部分转换**:将小数部分的BCD转换为二进制字符串,然后每4位一组进行处理。将每组4位二进制转换为对应的十进制数,并根据其在小数部分的位置确定其权重,最后相加得到小数部分的十进制值。 4. **合并结果**:将整数部分小数部分的十进制值相加,得到最终的十进制数。 ### 注意事项 - 输入的小数BCD需要按照正确的格式进行输入,即整数部分小数部分用 `.` 分隔。 - 代中假设输入的BCD是合法的,没有进行错误处理。在实际应用中,可能需要添加错误处理代来处理非法输入。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值