for循环 - while循环 - 习题解析

2024-06-22 12:20
文章标签 循环 习题 解析

本文主要是介绍for循环 - while循环 - 习题解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1389. 数据分析

问题描述

某军事单位采用特殊加密方法传递信息。传递一个整数n(10位以内),其长度代表第一个数字信息,将n的偶数位相加得到第二个数字信息。要求编写程序从n中获取这两个数字信息。

解题思路
  1. 读取输入:接收一个整数n。
  2. 计算位数:初始化一个计数器,循环除以10直到n变为0,得到位数。
  3. 计算偶数位之和:在计算位数的同时,判断每一位是否为偶数,如果是则累加。
  4. 输出结果:输出位数和偶数位之和。
代码实现
#include <iostream>
using namespace std;int main() {long long n;cin >> n;int digits = 0;int sum = 0;while (n > 0) {int digit = n % 10;digits++;if (digit % 2 == 0) {sum += digit;}n /= 10;}cout << digits << " " << sum << endl;return 0;
}
代码解析
  • 使用long long类型存储输入的n,因为n可能高达10^9。
  • 初始化digits变量记录位数,sum变量记录偶数位之和。
  • 使用while循环处理n的每一位:
    • n % 10获取最后一位数字。
    • digits++计数位数。
    • 判断该位是否为偶数,是则加到sum中。
    • n /= 10去掉最后一位。
  • 循环结束后,digits存储位数,sum存储偶数位之和。
  • 最后按要求格式输出结果。

1750. 有0的数

问题描述

求出1到n(n≤999)之间含有数字0的数的个数。

解题思路
  1. 遍历数字:从1遍历到n。
  2. 分解每个数:对于每个数,分解成个位、十位和百位。
  3. 检查每一位:检查每一位是否为0。
  4. 计数:如果一个数的任何一位是0,则计数器加1。
代码实现
#include <iostream>
using namespace std;int main() {int n;cin >> n;int count = 0;for (int i = 1; i <= n; i++) {int num = i;bool hasZero = false;while (num > 0) {if (num % 10 == 0) {hasZero = true;//存在0位break;}num /= 10;}if (hasZero) {count++;}}cout << count << endl;return 0;
}
代码解析
  • 读取输入n。
  • 使用for循环遍历1到n的所有数。
  • 对于每个数i:
    • 将i赋值给临时变量num
    • 使用while循环检查num的每一位:
      • 如果当前位(num % 10)等于0,设置hasZero为true并跳出循环。
      • 否则,将num除以10,检查下一位。
    • 如果hasZero为true,增加计数器count
  • 循环结束后,输出count,即包含0的数的个数。
  • 这种方法的时间复杂度仍然是O(n log n),因为对每个数都要检查其每一位。
  • 这个实现没有使用单独的函数,而是将所有逻辑都放在main函数中,符合不使用函数的要求。
  • 对于n≤999的情况,这种方法是足够高效的。如果n的范围更大,可能需要考虑更优化的算法。

1962. 数值计算

问题描述

给出一个不多于5位的非负整数(非0结尾),要求:

  1. 求出它是几位数
  2. 分别输出每一位数字
  3. 按逆序输出各位数字
解题思路
  1. 计算位数:使用循环除以10,直到商为0,计数得到位数。
  2. 输出每一位数字:利用整数除法和取模运算,从高位到低位输出每一位。
  3. 逆序输出:直接使用取模运算从低位到高位输出。
代码实现
#include <iostream>
#include <cmath>
using namespace std;int main() {int num, originalNum; // 声明变量存储输入的数字和原始数字cin >> num; // 读取输入的数字originalNum = num; // 保存原始数字,因为num会在后续操作中被修改// 计算位数int count = 0; // 初始化计数器int temp = num; // 临时变量,用于计算位数while (temp > 0) { // 当temp大于0时继续循环temp /= 10; // 每次除以10count++; // 位数加1}// 输出位数cout << count << endl; // 输出计算得到的位数// 输出每一位数字int divisor = pow(10, count - 1); // 计算最高位的除数while (divisor > 0) { // 当除数大于0时继续循环cout << num / divisor; // 输出当前位的数字if (divisor > 1) cout << " "; // 如果不是最后一位,输出空格num %= divisor; // 更新num为余数divisor /= 10; // 除数除以10,准备处理下一位}cout << endl; // 输出换行// 按逆序输出while (originalNum > 0) { // 当原始数字大于0时继续循环cout << originalNum % 10; // 输出最后一位originalNum /= 10; // 去掉最后一位}cout << endl; // 输出换行return 0; // 程序结束
}
代码解析
  • 代码中每一行都添加了注释,解释了该行的作用。
  • 这种实现方法不使用数组,而是通过数学运算来处理每一位数字。
  • 时间复杂度是O(log n),其中n是输入的数字,因为我们需要处理每一位数字。
  • 空间复杂度是O(1),因为只使用了常数级的额外空间。
  • 这个解决方案适用于不超过5位的正整数,完全符合题目要求。

1121. "倒"数

问题描述

输入一个正整数N(0<N<2147483647),将这个数倒着合成一个新数后输出。注意:不保留前导零。

解题思路
  1. 读取输入:读取给定的正整数N。
  2. 逐位处理:从个位开始,逐位提取数字。
  3. 构建新数:将提取的数字按相反顺序构建成新的数。
  4. 输出结果:输出构建的新数。
代码实现
#include <iostream>
using namespace std;int main() {int N; // 声明变量存储输入的正整数cin >> N; // 读取输入的数字int reversedNum = 0; // 用于存储倒序后的新数while (N > 0) { // 当N大于0时继续循环int digit = N % 10; // 获取N的最后一位数字reversedNum = reversedNum * 10 + digit; // 将digit添加到reversedNum的末尾N /= 10; // 去掉N的最后一位}cout << reversedNum << endl; // 输出倒序后的新数return 0; // 程序结束
}
代码解析
  • int N;:声明变量N来存储输入的正整数。

  • cin >> N;:从标准输入读取正整数N。

  • int reversedNum = 0;:初始化reversedNum为0,用于存储倒序后的新数。

  • while (N > 0):当N大于0时,继续循环处理每一位数字。

  • int digit = N % 10;:通过取模运算获取N的最后一位数字。

  • reversedNum = reversedNum * 10 + digit;:将新的数字添加到reversedNum的末尾。

  • N /= 10;:去掉N的最后一位数字。

  • cout << reversedNum << endl;:输出倒序后的新数。

  • 这种方法的时间复杂度是O(log N),其中N是输入的数字,因为我们需要处理每一位数字。

  • 空间复杂度是O(1),因为我们只使用了常数级的额外空间。

  • 这个解决方案自动处理了前导零的问题,因为在构建新数时,前导零自然被忽略了。

  • 该实现方法适用于题目给定范围内的所有正整数(0<N<2147483647)。

1469. 数的统计

问题描述

计算在区间1到n的所有整数中,数字x(0≤x≤9)共出现了多少次。

解题思路
  1. 读取输入:读取n和x的值。
  2. 遍历区间:从1遍历到n。
  3. 统计出现次数
    • 对每个数,分解其各个位。
    • 检查每一位是否等于x。
    • 如果等于,计数器加1。
  4. 输出结果:输出最终的计数。
代码实现
#include <iostream>
using namespace std;int main() {int n, x; // 声明变量n和xcin >> n >> x; // 读取输入的n和xint count = 0; // 初始化计数器// 遍历从1到n的每个数for (int i = 1; i <= n; i++) {int current = i; // 当前处理的数// 分解current的每一位并检查while (current > 0) {if (current % 10 == x) { // 如果当前位等于xcount++; // 计数器加1}current /= 10; // 去掉最后一位}}cout << count << endl; // 输出x出现的次数return 0; // 程序结束
}
代码解析
  • int n, x;:声明变量n和x,分别表示区间上限和要统计的数字。

  • cin >> n >> x;:从标准输入读取n和x的值。

  • int count = 0;:初始化计数器count为0。

  • for (int i = 1; i <= n; i++):遍历从1到n的每个数。

  • int current = i;:将当前处理的数赋值给current。

  • while (current > 0):循环处理current的每一位。

  • if (current % 10 == x):检查current的最后一位是否等于x。

  • count++;:如果等于x,计数器加1。

  • current /= 10;:去掉current的最后一位。

  • cout << count << endl;:输出最终的计数结果。

  • 时间复杂度:O(n log n),其中n是输入的上限值。对每个数都需要检查其每一位。

  • 空间复杂度:O(1),只使用了常数级的额外空间。

  • 这个解决方案适用于题目给定的所有输入范围(n是int范围内的整数)。

  • 该方法通过逐个检查每个数的每一位来统计x的出现次数,确保了准确性。

1511. 数字之和为13的整数

问题描述

求出1到n范围内的整数中,数字之和为13的数的个数。n不超过10000000。

解题思路
  1. 遍历范围:从1遍历到n。
  2. 计算数字和:对每个数,计算其各位数字之和。
  3. 统计符合条件的数:如果数字和等于13,计数器加1。
  4. 输出结果:输出最终的计数。
代码实现
#include <iostream>
using namespace std;int main() {int n; // 声明变量ncin >> n; // 读取输入的nint count = 0; // 初始化计数器// 遍历从1到n的每个数for (int i = 1; i <= n; i++) {int sum = 0; // 用于存储当前数字的各位之和int current = i; // 当前处理的数// 计算current的各位数字之和while (current > 0) {sum += current % 10; // 加上最后一位current /= 10; // 去掉最后一位}// 如果和为13,计数器加1if (sum == 13) {count++;}}cout << count << endl; // 输出符合条件的数的个数return 0; // 程序结束
}
代码解析
  • int n;:声明变量n,用于存储输入的范围上限。

  • cin >> n;:从标准输入读取n的值。

  • int count = 0;:初始化计数器count为0。

  • for (int i = 1; i <= n; i++):遍历从1到n的每个数。

  • int sum = 0;:初始化sum为0,用于存储当前数字的各位之和。

  • int current = i;:将当前处理的数赋值给current。

  • while (current > 0):循环处理current的每一位。

  • sum += current % 10;:将current的最后一位加到sum上。

  • current /= 10;:去掉current的最后一位。

  • if (sum == 13):检查sum是否等于13。

  • count++;:如果sum等于13,计数器加1。

  • cout << count << endl;:输出最终的计数结果。

  • 时间复杂度:O(n log n),其中n是输入的上限值。对每个数都需要计算其各位之和。

  • 空间复杂度:O(1),只使用了常数级的额外空间。

  • 这个解决方案适用于题目给定的所有输入范围(n≤10000000)。

  • 该方法通过逐个检查每个数的各位之和来统计符合条件的数的个数,确保了准确性。

  • 对于较大的n值,这种方法可能会比较耗时,但在给定的范围内仍然是可行的。

1149. 回文数个数

问题描述

给定一个正整数n(1≤n≤10000),求出1到n之间(包括1和n)的回文数的个数。

解题思路
  1. 遍历范围:从1遍历到n。
  2. 判断回文:对每个数,判断是否为回文数。
  3. 统计回文数:如果是回文数,计数器加1。
  4. 输出结果:输出最终的计数。
代码实现
#include <iostream>
using namespace std;int main() {int n; // 声明变量ncin >> n; // 读取输入的nint count = 0; // 初始化计数器// 遍历从1到n的每个数for (int i = 1; i <= n; i++) {int original = i; // 保存原始数字int reversed = 0; // 用于存储反转后的数字int temp = i; // 临时变量,用于反转过程// 反转数字while (temp > 0) {reversed = reversed * 10 + temp % 10;temp /= 10;}// 判断是否为回文数if (original == reversed) {count++;}}cout << count << endl; // 输出回文数的个数return 0; // 程序结束
}
代码解析
  • int n;:声明变量n,用于存储输入的范围上限。

  • cin >> n;:从标准输入读取n的值。

  • int count = 0;:初始化计数器count为0。

  • for (int i = 1; i <= n; i++):遍历从1到n的每个数。

  • int original = i;:保存原始数字。

  • int reversed = 0;:用于存储反转后的数字。

  • int temp = i;:临时变量,用于反转过程。

  • while (temp > 0):循环反转数字。

  • reversed = reversed * 10 + temp % 10;:构建反转后的数字。

  • temp /= 10;:去掉temp的最后一位。

  • if (original == reversed):判断原数字是否等于反转后的数字。

  • count++;:如果是回文数,计数器加1。

  • cout << count << endl;:输出最终的计数结果。

  • 时间复杂度:O(n log n),其中n是输入的上限值。对每个数都需要进行反转操作。

  • 空间复杂度:O(1),只使用了常数级的额外空间。

  • 这个解决方案适用于题目给定的所有输入范围(1≤n≤10000)。

  • 该方法通过反转每个数并与原数比较来判断是否为回文数,确保了准确性。

  • 对于给定的范围(最大10000),这种方法是高效且可行的。

1846. 阿尔法乘积

问题描述

计算一个整数的阿尔法乘积。阿尔法乘积的计算规则是:

  1. 如果是个位数,阿尔法乘积就是它本身。
  2. 否则,计算各位非0数字的乘积,然后重复此过程直到得到一个个位数。
解题思路
  1. 循环计算:使用循环代替递归,重复计算直到结果为个位数。
  2. 乘积计算:在每次循环中计算各位非0数字的乘积。
  3. 结果判断:当结果小于10时结束循环。
代码实现
#include <iostream>
using namespace std;int main() {int n; // 声明变量ncin >> n; // 读取输入的整数while (n >= 10) { // 当n不是个位数时继续循环int product = 1; // 用于存储各位非0数字的乘积int temp = n; // 临时变量,用于分解数字// 计算各位非0数字的乘积while (temp > 0) {int digit = temp % 10; // 获取最后一位数字if (digit != 0) {product *= digit; // 如果不是0,则乘到product中}temp /= 10; // 去掉最后一位}n = product; // 更新n为新的乘积}cout << n << endl; // 输出最终结果return 0; // 程序结束
}
代码解析
  • int n;:声明变量n,用于存储输入的整数和中间结果。

  • cin >> n;:从标准输入读取n的值。

  • while (n >= 10):外层循环,当n不是个位数时继续计算。

  • int product = 1;:初始化product为1,用于存储各位非0数字的乘积。

  • int temp = n;:临时变量temp,用于分解数字。

  • while (temp > 0):内层循环,处理temp的每一位数字。

  • int digit = temp % 10;:获取temp的最后一位数字。

  • if (digit != 0) { product *= digit; }:如果digit不为0,则乘到product中。

  • temp /= 10;:去掉temp的最后一位。

  • n = product;:更新n为新的乘积。

  • cout << n << endl;:输出最终结果。

  • 时间复杂度:O(log n * log n),其中n是输入的整数。外层循环最多执行log n次,每次内层循环也最多执行log n次。

  • 空间复杂度:O(1),只使用了常数级的额外空间。

  • 这个解决方案适用于题目给定的所有输入范围(int范围内的正整数)。

  • 该方法通过循环实现了阿尔法乘积的计算,避免了使用递归和函数调用,符合题目要求。

这篇关于for循环 - while循环 - 习题解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084275

相关文章

解析 XML 和 INI

XML 1.TinyXML库 TinyXML是一个C++的XML解析库  使用介绍: https://www.cnblogs.com/mythou/archive/2011/11/27/2265169.html    使用的时候,只要把 tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

tf.split()函数解析

API原型(TensorFlow 1.8.0): tf.split(     value,     num_or_size_splits,     axis=0,     num=None,     name='split' ) 这个函数是用来切割张量的。输入切割的张量和参数,返回切割的结果。  value传入的就是需要切割的张量。  这个函数有两种切割的方式: 以三个维度的张量为例,比如说一

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx_determin欧拉角简介演示 概述 本文将探讨

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

消息认证码解析

1. 什么是消息认证码         消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。         消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。         根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似

《学习OpenCV》课后习题解答7

题目:(P105) 创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect;称结构体为“my_struct”。 a. 写两个函数:void Write_my_strct(CvFileStorage* fs, const char * name, my_struct* ms) 和 void read_my_struct(CvFileStorage* fs, CvFileNode

《学习OpenCV》课后习题解答6

题目:(P104) 使用cvCmp()创建一个掩码。加载一个真实的图像。使用cvsplit()将图像分割成红,绿,蓝三个单通道图像。 a.找到并显示绿图。 b.克隆这个绿图两次(分别命名为clone1和clone2)。 c.求出这个绿色平面的最大值和最小值。 d.将clone1的所有元素赋值为theash=(unsigned char)((最大值-最小值)/2.0)。 e.将clone

《学习OpenCV》课后习题解答5

题目:(P104) 为一个图像创建多个图像头。读取一个大小至少为100*100的图像。另创建两个图像头并设置它们的origion,depth,nChannels和widthStep属性同之前读取的图像一样。在新的图像头中,设置宽度为20,高度为30.最后,将imageData指针分别指向像素(5,10)和(50,60)像素位置。传递这两个新的图像头给cvNot()。最后显示最初读取的图像,在那个

《学习OpenCV》课后习题解答3

题目:(P104) 创建一个大小为100*100的三通道RGB图像。将它的元素全部置0.使用指针算法以(20,5)与(40,20)为项点绘制一个绿色平面。 解答: #include "cv.h" #include "highgui.h" int main(int argc, char** argv) {IplImage* img = cvCreateImage(cvSize(100,