1001. A+B Format (20)[C语言]

本文介绍了一种使用C语言解决A+B问题的方法,并通过递归函数实现了千位分隔符的功能。输入为两个整数,输出则为带有逗号分隔的计算结果。

1001. A+B Format (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Calculate a + b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).

Input

Each input file contains one test case. Each case contains a pair of integers a and b where -1000000 <= a, b <= 1000000. The numbers are separated by a space.

Output

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.

Sample Input
-1000000 9
Sample Output
-999,991


直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void print1(int sum){
    if(sum/-1000 >= 1){
             print1(-(sum-sum%1000)/-1000);
             int r = (int)fabs(sum%(-1000));
             if(r!=0) {
                 if(r< 10){
                     printf(",00%d",-(sum%-1000));
                }else if(r < 100){
                     printf(",0%d",-(sum%-1000));
                }else{
                    printf(",%d",-(sum%-1000));
                }
            } 
             else  printf(",000");
    }else{
            printf("%d",sum);
    }
}


void print2(int sum){
    if(sum/1000 >= 1){
             print2((sum-sum%1000)/1000);
             int r = sum%1000 ;
         
             if(r!=0){
                 if(r < 10){
                     printf(",00%d",sum%-1000);
                }else if(r < 100){
                     printf(",0%d",sum%-1000);
                }else{
                    printf(",%d",sum%-1000);
                }
             } 
             else  printf(",000");
    }else{
            printf("%d",sum);
    }
}


int main(){
    int a , b ,sum; 
    scanf("%d %d",&a,&b);
    sum = a+b;
    if(sum < 0)    print1(sum);
    else print2(sum);
    
    return 0 ;
} 


 
<think>我们正在解决一个数学问题:计算调和级数的部分和,即 $1 + \frac{1}{2} + \frac{1}{3} + \cdots + \frac{1}{n}$ 的和。要求使用while循环,并且使用double类型来存储和(以避免整数除法问题)。 问题分析: 当使用整数除法时,例如1/i(i为整数),结果会是一个整数(向下取整)。例如,1/2的结果是0而不是0.5。因此,我们需要确保除法运算的结果是浮点数。 解决方案: 在循环中,我们需要将每一项转换为double类型再进行累加。可以通过以下方式之一实现: 1. 将分子写成浮点数形式(如1.0)。 2. 将分母强制转换为double类型(如(double)i)。 根据引用[3]中的示例,他们使用了while循环计算前20项的和,并且使用了强制类型转换:(double)1/i。 因此,我们可以参考这个思路来编写代码。 代码步骤: 1. 定义变量: int i = 1; // 循环计数器,从1开始 double sum = 0; // 用于累加和的变量 int n; // 用户输入的总项数 2. 读取用户输入的n(如果程序需要输入的话)。 3. 使用while循环,条件为i<=n: sum += 1.0 / i; // 注意:这里使用1.0(浮点数)除以整数i,结果自动提升为double 或者:sum += 1/(double)i; 然后递增i。 4. 输出结果。 注意:由于题目要求使用while循环,所以我们使用while。 参考引用[3]中的代码: double sum=0; int i=1; while(i<=20){ sum+=(double)1/i; i++; } System.out.format("%.3f\n",sum); 但是引用[3]是Java代码,我们需要用C语言实现(根据用户提供的初始代码,他是用C写的,但问题没有指定语言,根据上下文,我们假设使用C语言)。 用户最初的代码是C语言,所以我们也用C语言来写。 编写C语言代码: #include <stdio.h> int main() { int n; printf("Enter n: "); scanf("%d", &n); // 读取n double sum = 0.0; int i = 1; while (i <= n) { // 使用1.0/i来避免整数除法 sum += 1.0 / i; i++; } printf("The sum is: %f\n", sum); return 0; } 然而,用户提供的引用[1]中提到了一个错误:整数除法导致的问题,所以我们这里用1.0/i(或者写成1.0/(double)i)确保是浮点数除法。 注意:在C语言中,当除法的两个操作数一个为整数一个为浮点数时,整数会被转换为浮点数然后进行浮点除法。 因此,我们使用1.0/i是正确的。 如果用户不需要输入n,而是固定计算到100(如引用[1]),那么我们可以将n固定为100。但题目要求是计算到n,所以这里我们采用输入n的方式。 但是,用户的问题中并没有明确要求输入n,我们可以根据实际情况调整。比如,如果用户希望计算前100项,那么就将n设置为100。 为了灵活性,我们通常让用户输入n。 如果用户不需要输入,而是计算固定值(如前100项),则可以将n设为100。 现在,我们给出两种形式的代码: 形式1:固定n(例如100) 形式2:由用户输入n 由于用户的问题中没有明确,但引用的例子中有100、20等,所以我们可以提供两种选择,但根据问题描述,我们主要关注代码实现逻辑。 根据用户的问题:“计算1+1/2+...+1/n和”,通常n是变量,所以建议使用输入。 但是,用户最初代码中写死了100(引用[1]),所以我们也可以给出一个固定n的版本。 这里,我们先写一个固定n=100的版本,然后再写一个可输入n的版本。 固定n=100的代码: #include <stdio.h> int main() { int i = 1; double sum = 0.0; // 固定n=100 int n = 100; while (i <= n) { sum += 1.0 / i; i++; } printf("sum = %lf\n", sum); return 0; } 可输入n的代码: #include <stdio.h> int main() { int n; printf("请输入n: "); scanf("%d", &n); int i = 1; double sum = 0.0; while (i <= n) { sum += 1.0 / i; i++; } printf("1 + 1/2 + ... + 1/%d 的和 = %lf\n", n, sum); return 0; } 注意:在可输入n的代码中,我们假设n是正整数(大于等于1)。 现在我们回答用户的问题:使用while循环,用double类型计算1+1/2+...+1/n和的代码实现。 我们提供了上述两个版本的C语言代码。 此外,引用[3]和引用[4]也提供了类似思路(引用[4]是for循环,但原理相同)。 注意:引用[2]中计算的是阶乘倒数和(注意看它的累加方式:b=(1.0/a)*b; 然后c+=b,实际上是计算1/1! + 1/2! + ...),与调和级数不同。所以我们不采用。 因此,我们主要参考引用[1]和引用[3]的修正方法。 结论:使用while循环,在每次迭代中执行sum += 1.0/i,并确保i从1递增到n。 最后,我们输出结果。 注意:调和级数的部分和会随着n增大而缓慢增大,且当n很大时,和会很大(虽然增长缓慢),但double类型通常可以处理很大的n(直到精度不够为止)。 现在,我们按照要求生成相关问题。 </think>以下是使用 `while` 循环和 `double` 类型计算 $1 + \frac{1}{2} + \frac{1}{3} + \cdots + \frac{1}{n}$ 和的代码实现(C语言): ```c #include <stdio.h> int main() { int n; printf("请输入正整数 n 的值: "); scanf("%d", &n); // 读取用户输入的 n[^4] double sum = 0.0; // 使用 double 类型存储累加和 int i = 1; // 初始化循环计数器 while (i <= n) { // while 循环条件 sum += 1.0 / i; // 关键:使用 1.0 避免整数除法 i++; // 更新计数器 } printf("1 + 1/2 + ... + 1/%d = %lf\n", n, sum); return 0; } ``` ### 关键说明: 1. **避免整数除法**:代码 `1.0 / i` 确保浮点数除法(若写 `1/i` 会导致整数除法错误,如 `1/2=0`)[^1] 2. **精度保障**:`double` 类型可处理分数累加时的精度损失 3. **动态输入**:通过 `scanf` 读取用户输入的 `n`,支持任意正整数计算[^4] 4. **循环逻辑**:`while` 循环从 $i=1$ 开始,累加到 $i=n$ 结束 ### 示例输出: ``` 请输入正整数 n 的值: 20 1 + 1/2 + ... + 1/20 = 3.597740 ``` ### 其他语言参考: - **Java**(根据引用[3]调整): ```java double sum = 0; int i = 1, n = 20; while(i <= n) { sum += 1.0 / i; // 必须用 1.0 而非 1 i++; } System.out.printf("和 = %.6f", sum); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值