习题3-8 循环小数

该博客介绍了如何处理C/C++编程中遇到的循环小数问题,通过输入整数a和b,计算a/b的循环小数表示及循环节长度。博主分享了关键思路,包括利用乘法和取余操作,识别相同余数以确定循环节,并用数组记录余数历史,最后通过数学知识确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题对我来说有点难,好好学习其中的思想,很重要滴!!

题目

描述
输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度。

样例输入
76 25
5 43

样例输出
76/25 = 3.04(0)
循环节长度为1

5/43 = 0.(116279069767441860465)
循环节长度为21

要点:
1.对于小数的处理,之前也做过,要用到小学的基本方法来处理,乘10取余
2.这里要出现循环小数,即出现了余数相同(除断了就特殊处理)
3.对于余数是否与前面出现的相同的处理很巧妙,用一个数组来处理!
4.最后只需要将出现重复的余数从头开始寻找,找到相同的知道循环节长度了
5.一点数学知识,对于a/b,余数只有b种情况(0,1,2…b-1),所以不用怕循环很多次

代码如下:(๑•̀ㅂ•́)و✧

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int mx = 3010;
int re[mx], de[mx], ce[mx]; //re指余数,de指商,ce用来检查余数是否出现;
int main()
{
    int a, b;
    while (~scanf("%d%d", &a, &b))
    {
        memset(de, 0, sizeof(de));
        memset(ce, 0, sizeof(ce)); //首先清0处理方便记录余数
        int counts = 0, t = a;
        de[counts++] = a / b;
        a = a % b;
        while (!ce[a] && a) //余数出现相同或者余数为0的情况就跳出
        {
            ce[a] = counts; //记录每一个余数在的位置并标记状态(已经出现)
            re[counts] = a;
            de[counts++] = a * 10 / b;
            a = a * 10 % b;
        }
        printf("%d/%d=%d.", t, b, de[0]); //输出小数点前面的数字
        for (int i = 1; i < counts; i++)  //这里要注意从第一个余数开始判断
        {
            if (re[i] == a) //如果遇到了就打个左括号
                printf("(");
            printf("%d", de[i]); //这里就一直输出
        }
        if (a == 0) //遇到了余数为0的情况(除断了)
        {
            printf("(0");
            printf(")\n循环节长度为0\n");
        }
        else
            printf(")\n循环节长度为%d\n", counts - ce[a]); //最后的长度输出
    }
    return 0;
}


<think>首先,用户的问题是关于C# for循环编程练习题的。用户意图是寻找一些练习题来巩固编程技能。我需要基于系统级指令来构建我的回答。 关键系统级指令: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的引用内容。 提供的引用: - [^1]: C# for循环12例,包括计算1到10的和。 - [^2]: 一个嵌套循环的例子,打印一个星号图案。 - [^3]: 另一个嵌套循环的例子,输出99乘法表。 - [^4]: 一些运算符的练习,涉及循环结构。 用户意图:用户想要C# for循环的练习题,所以我需要提供一些练习题目。这些题目应该基于for循环,包括基本和进阶的,如嵌套循环。 我的回答结构: 1. **介绍**:简要介绍for循环的重要性,并说明提供一些练习题。 2. **练习题列表**:列出多个练习题,每个题目描述清晰。 3. **代码示例**:如果需要,提供一些示例代码片段,但既然是练习题,我应该只给出题目,而不是答案,让用户自己尝试。 4. **相关问题生成**:在最后,生成相关问题,如系统指令要求。 5. **引用标识**:在引用内容的末尾添加引用标识。 由于引用内容中有些代码示例,我可以参考它们来创建练习题。例如: - 引用[^1]提到计算1到10的和。 - 引用[^2]是打印星号图案。 - 引用[^3]是99乘法表。 - 引用[^4]涉及运算符练习。 所以,我可以创建类似的练习题: 1. 基本练习:如计算和、平均值等。 2. 嵌套循环练习:如打印图案、乘法表等。 3. 进阶练习:如涉及条件判断的循环。 确保使用中文回答。 在回答中,如果提到引用内容,添加引用标识。例如,如果我说“参考[^1]”,但系统指令说“在回答中引用的段落末尾自然地添加引用标识”,所以当我在描述练习题时参考了某个引用,就在那个描述后添加。 系统指令示例中说:“生成相关问题”,所以我需要在回答末尾添加一个“相关问题”部分。 最终回答结构: - 开头:介绍。 -习题部分:列出5-10个练习题- 结尾:鼓励用户尝试。 - 相关问题:生成2-3个相关问题。 练习题想法: 1. 计算1到n的和(n由用户输入)。 2. 打印一个三角形星号图案(如引用[^2])。 3. 输出99乘法表(如引用[^3])。 4. 计算阶乘。 5. 找出数组中的最大值。 6. 打印斐波那契数列的前n项。 7. 嵌套循环打印数字金字塔。 确保题目使用中文描述。 在数学表达式中使用LaTeX: - 例如,在描述“计算1到n的和”时,可以说“计算 $ \sum_{i=1}^{n} i $ ”。 - 独立公式如果需要,但这里可能不多。 相关问题生成: - 基于练习题,如“如何在C#中优化for循环?”或“for循环与while循环的区别是什么?” 引用标识:当我提到引用内容时添加。例如: - “这是一个经典的练习题[^1]。” 但引用[^1]是关于计算和的,所以可以这样用。 现在,列出练习题: 1. 计算1到n的和:用户输入一个整数n,计算1到n的和。 2. 打印星号三角形:用户输入行数,打印一个星号三角形,如: * ** *** 3. 输出99乘法表:使用嵌套循环输出99乘法表。 4. 计算阶乘:用户输入n,计算n的阶乘。 5. 找出数组中的最大值:用户输入一个整数数组,使用for循环找出最大值。 6. 打印斐波那契数列:用户输入n,打印前n项斐波那契数列。 7. 计算平均值:用户输入一组数字,计算它们的平均值。 8. 嵌套循环打印数字金字塔:如打印: 1 22 333 等等。 在描述中,参考引用: - 对于计算和,参考[^1]。 - 对于星号图案,参考[^2]。 - 对于乘法表,参考[^3]。 - 运算符练习参考[^4],但引用[^4]是关于运算符的,不是直接循环练习,所以可能不直接相关。 在回答中自然地添加引用。 最后,生成相关问题: 1. C#中for循环的常见错误有哪些? 2. 如何调试嵌套循环问题? 3. for循环与其他循环结构的比较?</think>### C# for循环编程练习题 为了帮助您巩固C#中的for循环编程技能,我整理了一系列练习题。这些题目覆盖了基础到进阶的内容,包括单层循环、嵌套循环、条件判断等。每个题目都基于实际编程场景设计,建议您先独立尝试实现,再参考相关资源或验证答案。以下练习题的灵感来源于经典编程示例[^1][^2][^3],并结合了常见错误规避技巧[^4]。 #### 练习题列表(共8题) 1. **计算1到n的和** 用户输入一个正整数n,使用for循环计算$ \sum_{i=1}^{n} i $的值(即1 + 2 + ... + n),并输出结果。 *示例输入:n = 5,输出:15* *提示:参考基础求和示例[^1]。* 2. **打印星号三角形** 用户输入行数rows,使用嵌套for循环打印一个直角三角形星号图案。例如,当rows=3时,输出: `*` `**` `***` *提示:内层循环控制每行星号数量,外层控制行数[^2]。* 3. **输出99乘法表** 使用嵌套for循环输出完整的99乘法表,格式为“i x j = k”(例如“3 x 4 = 12”),每行对齐。 *示例输出:* `1x1=1 1x2=2 ...` `2x1=2 2x2=4 ...` *提示:参考乘法表实现[^3],注意使用`Console.Write`和`Console.WriteLine`控制格式。* 4. **计算阶乘** 用户输入一个非负整数n,使用for循环计算n的阶乘($ n! = 1 \times 2 \times \cdots \times n $),并输出结果。注意处理n=0的情况(0! = 1)。 *示例输入:n = 4,输出:24* 5. **找出数组最大值** 用户输入一个整数数组(例如{3, 7, 2, 9, 1}),使用for循环遍历数组,找出并输出最大值。 *提示:初始化一个变量存储最大值,在循环中比较更新[^4]。* 6. **打印斐波那契数列** 用户输入项数n,使用for循环生成斐波那契数列的前n项(序列定义为$ F_1 = 1, F_2 = 1, F_n = F_{n-1} + F_{n-2} $),并输出。 *示例输入:n = 5,输出:1, 1, 2, 3, 5* 7. **计算数字平均值** 用户输入一组数字(以空格分隔),使用for循环解析输入,计算平均值,并输出(保留两位小数)。 *示例输入:"5 10 15",输出:10.00* *提示:注意数据类型转换和除法精度问题[^4]。* 8. **打印数字金字塔** 用户输入层数levels,使用嵌套for循环打印数字金字塔。例如,levels=3时,输出: `1` `22` `333` *进阶:尝试打印对称金字塔,如`1` `121` `12321`。* #### 练习建议 - **步骤1:独立尝试**:为每个题目编写C#代码,先理清逻辑再编码。 - **步骤2:调试与验证**:使用Visual Studio或在线编译器运行代码,检查边界条件(如n=0或负数)。 - **步骤3:参考资源**:如果卡壳,回顾引用中的示例代码[^1][^2][^3],但避免直接复制答案。 - **常见错误提示**:注意循环变量初始化、终止条件(如使用`<` vs `<=`),以及运算符优先级问题[^4]。 通过完成这些练习,您将熟练掌握for循环的迭代控制、数据遍历和算法实现。如果在实现中遇到问题,可以提供您的代码片段,我可以进一步指导优化!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值