正序分解整数(13425--->1 3 4 2 5 )

2024-02-08 11:08
文章标签 整数 分解 正序 13425

本文主要是介绍正序分解整数(13425--->1 3 4 2 5 ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

方案一

Step1.先学习输入13425,得出5 2 4 3 1的处理 

Step2.得出正序分解整数的方案一

方案二

step1.给出简单整数的处理方法

step2.解决整数末尾为零无法分解的问题

Step3.使mask具有普适性

法一

法二

法三


方案一

Step1.先学习输入13425,得出5 2 4 3 1的处理 

#include<stdio.h>int main()
{int x;scanf("%d",&x);int t;do{t=x%10;printf("%d",t);if(x>9)printf(" ");x /=10;}while(x>0);printf("\n");return 0;} 

Step2.得出正序分解整数的方案一

输入13425,输出52431后能输出1 3 4 2 5的处理(即先逆序,再逆序): 

#include<stdio.h>int main()
{int x;scanf("%d",&x);x=13425;int t=0;//t用来构建逆序过来的数 do{int d=x%10;t=t*10+d;x /=10;	}while(x>0);printf("x=%d,t=%d\n",x,t);x=t;//为使x还能进行接下来的处理,把 
/*d=5,t=5,x=1342d=2,t=52,x=134;......
直到d=1,t=52431,x=0时不满足x>0,从而跳出循环*/do{int d=x%10;printf("%d",d);if(x>9)printf(" ");x /=10;}while(x>0);printf("\n");return 0;
} 

当输入变成700时,最后输出不是700,而是7,因而这种先逆序再逆序的方案只适用于整数末尾没有零的情况。

方案二

step1.给出简单整数的处理方法

#include<stdio.h>int main()
{int x;scanf("%d",&x);/*   13425/10000--1   1是我们需要提取出来的数 13425%10000--3425  提取完后取余把已提取的数删掉 10000/10-----1000  后续每一轮用去取余的数也要减一位 
*	3425/1000----33425%1000----4251000/10------100
*	425/100------4425%100------25100/10-------10
*	25/10--------225%10--------510/10--------1
*	5/1----------5 5%1----------01/10---------0    */int mask=10000;do{int d = x / mask;/*printf("%d",d);if(x>9){printf(" ");}  */x %=mask;mask /=10;printf("x=%d,mask=%d,d=%d\n",x,mask,d); }while(x>0);return 0;
}  

step2.解决整数末尾为零无法分解的问题

当输入值是70000时,发现最后得出的d=7,不成立,原因在于,当整数末尾有零时,x=0时就提前结束循环了,所以只要把while(x>0)和if(x>0)改为(mask>0)即可。此时一开始列的计算就起了作用,在写算法前给出了直观而清晰的数据变化过程,帮助我们确定循环开始和结束的条件。

#include<stdio.h>int main()
{int x;scanf("%d",&x);/*   13425/10000--1   1是我们需要提取出来的数 13425%10000--3425  提取完后取余把已提取的数删掉 10000/10-----1000  后续每一轮用去取余的数也要减一位 
*	3425/1000----33425%1000----4251000/10------100
*	425/100------4425%100------25100/10-------10
*	25/10--------225%10--------510/10--------1
*	5/1----------5 5%1----------01/10---------0    */int mask=10000;do{int d = x / mask;printf("%d",d);if(mask>9){printf(" ");}x %=mask;mask /=10;}while(mask>0);return 0;
}  

Step3.使mask具有普适性

上一步我解决了整数末尾为零不能计算的情形,接下来,要考虑如何使程序自行识别输入数字后得出mask的问题了。

法一

将问题转化成两步,利用循环计算数字位数cnt,再引进pow函数计算出mask的值。具体如下:

#include<stdio.h>int main()
{int x;scanf("%d",&x);int cnt=0;do{x /=10;cnt++;}while(x>0);int mask=pow(10,cnt-1);printf("%d",mask);return 0;
}  

法二

更简便的方法是,在每一轮x/10的同时,让mask一步步乘上去,如下:

#include<stdio.h>int main()
{int x;scanf("%d",&x);int mask=1;do{x /=10;mask *=10;}while(x>0);printf("mask=%d\n",mask);return 0;
}

但是不难发现mask总比期望值大十倍,所以我们要让这个循环少跑一轮,将while(x>0)改成(x>9);

如果直接将此计算插入的话,下一个循环要用的x的值已被破坏,所以我们要定义另一个量代替x进行mask的计算。特别注意,这个量必须放在x已被识别后赋值。

int x;
int X=x;
scanf("%d",&x);

上图是错误的!

#include<stdio.h>int main()
{int x;scanf("%d",&x);int X=x;int mask=1;do{X /=10;mask *=10;}while(X>9);printf("mask=%d\n",mask);do{int d = x / mask;printf("%d",d);if(mask>9){printf(" ");}x %=mask;mask /=10;}while(mask>0);return 0;
}  

法三

进一步提高mask的普适性。

这样就对了吗,我们还要考虑一些边界的情况:如输入1时,我们希望mask=1,而不是10。

这个情况,其实是do while循环的特性导致的,即不管什么条件,都会进行一次循环,我们不妨改用while循环来避免,即只有当x不是一位数时才有必要进入这个循环。如下:

#include<stdio.h>int main()
{int x;scanf("%d",&x);int X=x;int mask=1;while(X>9){X /=10;mask *=10;}do{int d = x / mask;printf("%d",d);if(mask>9){printf(" ");}x %=mask;mask /=10;}while(mask>0);return 0;
}  

这篇关于正序分解整数(13425--->1 3 4 2 5 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

PTA求一批整数中出现最多的个位数字

作者 徐镜春 单位 浙江大学 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中给出正整数N(≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。 输出格式: 在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

单精度浮点数按存储格式转为整数的程序

///#include<cstdio>//-----------------union int_char{unsigned char ch[4];float i;};void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上。{printf("单精度浮点数值为:%f\n",x.i,x.i);printf("存储位置从左到右

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言         学习了特征值分解和奇异值分解相关知识,发现其可以用于图片压缩,但网上没有找到相应代码,本文在学习了之后编写出了图片压缩的代码,发现奇异值分

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),

Java中等题-整数替换(力扣)

给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n 。如果 n 是奇数,则可以用 n + 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 输入:n = 8输出:3解释:8 -> 4 -> 2 -> 1 示例 2: 输入:n = 7输出:4解释:7 -> 8 -> 4 -> 2 -> 1或 7 ->

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%

连分数因子分解法——C语言实现

参考网址:连分数分解法寻找整数的因子(Python)-CSDN博客 大数运算:C语言实现 大数运算 加减乘除模运算 超详细_64编程 加减乘除取模 复杂运算-CSDN博客 ‌连分数因子分解法‌是一种用于大整数因子分解的算法,它是计算数论中的一个重要方法。连分数因子分解法通过寻找x2≡y2 (mod p)x2≡y2 (mod p)的形式来分解N。具体来说,这种方法涉及到计算N的简单连分数展开,并

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

《机器学习》 基于SVD的矩阵分解 推导、案例实现

目录 一、SVD奇异值分解 1、什么是SVD 2、SVD的应用         1)数据降维         2)推荐算法         3)自然语言处理 3、核心         1)什么是酉矩阵         2)什么是对角矩阵 4、分解过程 二、推导 1、如何求解这三个矩阵         1)已知:          2)根据酉矩阵的特点即可得出: