整数分解5.3.2

news2024/11/14 15:41:56

                                               题

 前面写过逆序的

最后一个数后面不要有空格

#include <stdio.h>

int main()
{
	int x;
	scanf("%d",&x);
	int d;
	do{
	   d=x%10;
	   printf("%d",d);
	   if(x>=10){
	   	printf(" ");
	   }
	   x/=10;
	}while(x>0);
	printf("\n");
	return 0;
}

 

现在这个是逆序的    

x%10如果到只剩个位时 后面再取余就等于0了所以是最后一位     这时用if语句限制这个条件就可以做到最后一个数后面没有空格。

把他正序思路也很简单,就是先给他逆序过去  再逆序过来  逆逆得正

#include <stdio.h>

int main()
{
	int x;
	scanf("%d",&x);
	int t=0;
	do{
	    int d=x%10;
		t=t*10+d;
		x/=10;
	}while(x>0);
	printf("x=%d,t=%d\n", x, t);
	x=t;
	do{
	   int d=x%10;
	   printf("%d",d);
	   if(x>=10){
	   	printf(" ");
	   }
	   x/=10;
	}while(x>0);
	printf("\n");
	return 0;
}

但这种逆序两次的方法不能适用于末位数为零的数字

如果末位为零就会这样  就得换种方法        太难了  不会。。。。。

#include <stdio.h>

int main()
{
	int x;
	scanf("%d", &x);
	
	int mask = 1;
	int t = x;
	while(t>9){
		t /= 10;
		mask *=10;
	}
	printf("x=%d, mask=%d\n", x, mask);
	do {
		int d = x / mask;
		printf("%d", d);
		if (mask>9){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	}while( mask > 0 );
	printf("\n");
	return 0;
}

 

 这个就是最终改进的     下面一步一步来理解

    思路

1  x=12345
2  12345/10000  ->1
3  12345%10000  ->2345
4  10000/10     ->1000
5  2345/1000    ->2
6  2345%1000    ->345
7  1000/10      ->100
8  345/100      ->3
9  345%100      ->45
10 100/10       ->10
11 45/10        ->4
12 45%10        ->5
13 10/10        ->1
14 5/1          ->5
15 5%1          ->0
16 1/10         ->0
 此时第 2,5,8,11,14行的就是要求的结果


这就是一个循环   输出那几行的数就是答案

#include <stdio.h>

int main()
{
	int x;
//	scanf("%d", &x);
	x=12345;
	int mask=10000;
	do{
		int d = x / mask;
		x %= mask;
		mask /=10;
		printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(x>0);
	printf("\n");
	return 0;
}

 这是第一步   求出每一位的数字   d就是要求的结果

但这个写法是错误的对一些边界就不能用了    上面这个写法是错的

错误原因

以70000为例    
70000/10000   ->7
70000%10000   ->0
这里第二个数就是0了下面就没法再算了
而while的条件是x>0   这时候就直接输出了
但这时候mask它并不是零   等到mask为零的时候就对了所以要把while的条件改为mask>0;

 

就会得到这样的答案。

 

这就是改过之后的结果  是符合的   

下一步

#include <stdio.h>

int main()
{
	int x;
//	scanf("%d", &x);
	x=70000;
	int mask=10000;
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	//	printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(mask>0);
	printf("\n");
	return 0;
}

里面加了一个加空格的if语句   if语句的条件也和上面的那个一样  如果还是x>0的话那就只有第一个数后面有空格  这样就错了

下一步

现在程序的mask是一个固定的数值   输入的x不是固定的可以是任意位数   mask对应几位数就要为该位数的最小数10  100 1000....  这时候就要找一个能根据x的不同让mask与他保持同位数的方法

计算整数的位数

 

#include <stdio.h>

int main()
{
	int x;
//	scanf("%d", &x);
	x=70010;
	int cnt = 0;
	do{
		x/=10;
		cnt++;
	}while(x>0);
		printf("cnt=%d\n", cnt);
		int mask = 10000;
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	//	printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(mask>0);
	printf("\n");
	return 0;
}

理解


加入一个变量cnt   让他来表示位数
让x/=10来一次次减少他的位数  然后累加cnt就得到了x是几位数

 表示mask   可以引入pow函数   但不建议用    #include <math.h>

                                                                          pow

还没学

另外一种方法 思路清晰简单  就是让初始变量mask=1;然后让它加到上面那个算几位数的循环里

让他每循环一次乘于一次10就好了,

#include <stdio.h>

int main()
{
	int x;	scanf("%d", &x);
//	x=70010;
	int cnt = 0;
	int mask = 1;
	do{
		x/=10;
		mask *=10;
	}while(x>0);
		printf("mask=%d\n", mask);
//	int mask = 10000;
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	//	printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(mask>0);
	printf("\n");
	return 0;
}

  就是上面这样       然后你会发现它多了一个0       .。。。。。。。。。。。。。。。。。。。

                                                              

这样也是错的。。。。。。。。。。。。。。。 可以在循环后面给mask除去一个10   .。。/。。/

也可以把这个循环里面的条件x>0改为x>9这样是应为它一直除到只剩个位数的时候结果就小了不满足循环条件了 就少了一遍循环 位数就对了    但这种方法不能以偏概全   这种错误的由来自do-while循环本身的·特性    他是先执行一遍再判断循环  所以多了   

这时候就要换while循环

#include <stdio.h>

int main()
{
	int x;	scanf("%d", &x);
//	x=70010;
	int mask = 1;
	while(x>9){
		x /= 10;
		mask *=10;
	}
		printf("mask=%d\n", mask);
//	int mask = 10000;
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	//	printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(mask>0);
	printf("\n");
	return 0;
}

 

这时候mask的值就能确保是正确的    但你发现  下面输出的结果已经错很久了 

原因 在上面第一个循环输出x的值

 你会发现此时的x的值已经被替换了,所以还要引入一个变量让他等于x  让这个新引入的变量代替第一个循环体中的x    

#include <stdio.h>

int main()
{
	int x;	scanf("%d", &x);
//	x=70010;
	int mask = 1;
	int t = x;
	while(t>9){
		t /= 10;
		mask *=10;
	}
		printf("t=%d,mask=%d\n", t, mask);
//	int mask = 10000;
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	//	printf("x=%d,mask=%d,d=%d\n", x, mask, d);
	}while(mask>0);
	printf("\n");
	return 0;
}

 

至此 所有的问题就都解决了

最后再优化一下

#include <stdio.h>

int main()
{
	int x;	scanf("%d", &x);
	int mask = 1;
	int t = x;
	while(t>9){
		t /= 10;
		mask *=10;
	}
	do{
		int d = x / mask;
		printf("%d", d);
		if(mask>0){
			printf(" ");
		}
		x %= mask;
		mask /=10;
	}while(mask>0);
	printf("\n");
	
	return 0;
}

 

 很多细节很重要   比如循环条件的选择    对一些语句特性的理解     某些多次要运用的变量在哪里被用过之后数额是否发生变化   

最重要的是思维  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0818---算法

牛牛快递 如何输入一个字符&#xff1f; java中Scanner类没有.nextChar import java.utol.Scanner; Scanner in new Scanner(System.in); char b in.next().charAt(0);思路&#xff1a; 创建一个Scanner对象&#xff0c;调用Scanner对象的next()方法获取控制台输入的字符串…

Java二十三种设计模式-备忘录模式(19/23)

本文深入探讨了备忘录模式&#xff0c;从定义、组成、实现到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;全面解析了如何在软件开发中有效地保存和恢复对象状态&#xff0c;以支持复杂的撤销操作和历史状态管理。 备忘录模式&#xff1a…

【JAVA OOP】Day09 抽象方法、抽象类、接口、引用类型数组

Day09目标&#xff1a; 理解抽象方法、抽象类的应用场景&#xff1b; 掌握抽象方法、抽象类的语法&#xff1b; 理解接口的应用场景&#xff1b; 掌握接口的语法、应用&#xff1b; 掌握引用类型数组的用法&#xff1b; 代码量&#xff1a;课上120行&#xff0c;课下240行…

AvaloniaChat—从源码构建指南

AvaloniaChat介绍 一个使用大型语言模型进行翻译的简单应用。 我自己的主要使用场景 在看英文文献的过程中&#xff0c;比较喜欢对照着翻译看&#xff0c;因此希望一边是英文一边是中文&#xff0c;虽然某些软件已经自带了翻译功能&#xff0c;但还是喜欢大语言模型的翻译&…

2-69 基于matlab的三坐标雷达目标跟踪数据融合

基于matlab的三坐标雷达目标跟踪数据融合,采用的是概率数据关联算法和EKF&#xff0c;展示了目标的真实轨迹和跟踪滤波轨迹&#xff0c;以及数据融合的轨迹。程序已调通&#xff0c;可直接运行。 2-69 三坐标雷达目标跟踪数据融合 - 小红书 (xiaohongshu.com)

『 Linux 』利用UDP套接字简单进行网络通信

文章目录 Socket常见API转网络字节序网络数据传输的读网络数据传输的写 简单的UDP网络程序服务端基本结构Init() 服务端的初始化Run() 服务端的运行服务端启动及测试 简单的UDP网络程序客户端服务端客户端相互通信测试服务端通过传入命令处理实现远程命令执行参考代码 Socket常…

STM32————串口发送和接收数据包

首先进行实验&#xff0c;对于代码在上一节的基础上&#xff0c;先定义新变量以及增加一个发送数据包函数&#xff1a; 本代码设置FF为包头&#xff0c;FE为包尾&#xff0c;中间为需要传输的数据&#xff0c;一次为4个&#xff0c;之后是接收数据包的函数 当标志位为1代表接收…

SpringBoot+Vue实现大文件上传(分片上传)

SpringBootVue实现大文件上传&#xff08;分片上传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 问题 前几篇文章&#xff0c;可以用于较小文件的上传&#xff0c;对于较大文件来说&#xff0c;为了提高上传效率和可靠性&#xff0c;可以采…

LeetCode题练习与总结:二叉树的右视图--199

一、题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出…

判别回形针的方向(clip.hdev)

1.1应用示例思路 (1) 利用Blob分析(一般步骤&#xff1a;图像阈值分割、获取连通区域、计算Blob的相关几何特征)&#xff0c;获取目标区域。 (2) 求目标区域的中心坐标和方向。 1.2应用实例代码 * clip.hdev: Orientation of clips*是否必须在活动的图形窗口中显示图标对象…

“论面向服务架构设计及其应用”写作框架,软考高级,系统架构设计师

论文真题 面向服务架构&#xff08;Service-Oriented Architecture, SOA&#xff09; 是一种应用框架&#xff0c;将日常的业务应用划分为单独的业务功能服务和流程&#xff0c;通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构&#xff0c;用…

GPT-5 惊涛来袭:铸就智能新传奇

目录 引言&#xff1a; 正文&#xff1a; 方向一&#xff1a;人工智能发展现状 方向二&#xff1a;GPT-5技术突破预测 方向三&#xff1a;智能系统人类协作 方向四&#xff1a;迎接AI技术变革策略 结束语&#xff1a; 引言&#xff1a; 在科技浩渺浪潮澎湃翻涌的时代&…

ThinkPHP5 5.0.23 远程代码执行漏洞

目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…

聚星文社,绘唐科技AI工具

聚星文社是一个文学创作社区&#xff0c;为广大创作者提供了一个交流和展示作品的平台。绘唐科技是一家AI技术公司&#xff0c;专注于开发人工智能工具和解决方案。绘唐科技与聚星文社合作&#xff0c;为聚星文社的创作者提供了一款AI工具&#xff0c;帮助创作者提升创作效率和…

ES+FileBeat+Kibana日志采集搭建体验

1.环境准备 需要linux操作系统&#xff0c;并安装了docker环境 此处使用虚拟机演示。&#xff08;虚拟机和docker看参考我之前写的文章&#xff09; VirtualBox安装Oracle Linux 7.9全流程-CSDN博客 VirtualBox上的Oracle Linux虚拟机安装Docker全流程-CSDN博客 简单演示搭建ES…

高可用集群keepalived 详细讲解

一&#xff1a;高可用集群keepalived LB&#xff1a;Load Balance 负载均衡 负载均衡&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器…

git详细命令

git常用命令&#xff0c;待 1. 前言2. Git安装3. 公钥3.1 生成公钥3.2 配置SSH 密钥 4. 配置用户名和邮箱5. git常用命令5.1 创建仓库命令5.1.1 git init命令5.1.2 git clone[url] 命令 5.2 add 增加 / 删除文件 &#xff08;跟踪文件&#xff09;5.3 代码提交5.4 分支5.5 标签…

性能优化理论篇 | Cache VS Buffer,傻傻分不清 ?

性能优化系列目录&#xff1a; 性能优化理论篇 | 彻底弄懂系统平均负载 性能优化理论篇 | swap area是个什么东西 从free命令开始 free 命令是一个在类 Unix 操作系统中用于显示内存使用情况的工具。它的输出包含了系统内存的不同方面&#xff0c;如总内存、已用内存、空闲内存…

不同路径 II[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 一个机器人位于一个m x n网格的左上角 &#xff08;起始点在下图中标记为Start&#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为Finish&#xff09;。 现在考虑网格中有…

@[TOC](letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度)

letcode 分类练习 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度 226.翻转二叉树 利用自底向上的遍历交换左子树和右子树 class Solution { public:TreeNode* invertTr…