编写程序,任意输入一个正整数,输出其各位数字重排后最小的整数。 例如: 输入:2017输出127?
发布网友
发布时间:2022-04-24 11:43
我来回答
共2个回答
热心网友
时间:2022-04-24 13:12
一行就能完成的,你们这样忽悠题主真的好吗#include <stdio.h>
int main(int c,char** p)
{
return (c=getchar())!=EOF?main(c,p),putchar(c),0:0;
}
热心网友
时间:2022-04-24 14:30
上面的题目是不是拗口呢?理解一下其实也不是很费解,比如100,逐位累加就是1+0+0=1,最后是1位数,结果就是1;再例如99逐位累加就是9+9=18,18不是一位数,再累加1+8=9,9是1位数,结果就是9。
还想到有一个速算的题:求10011除以9的余数。最简单的算法就是1+0+0+1+1=3,余数就是3。好了我们就按照这个思路去解决提出的问题。也就是说对于一个正整数,我们利用MOD(正整数,9)的结果就可以求出这个正整数逐位循环累加,直到最后变成一位数字的结果。
有了上述的思路我们再完善一下:如18,结果应为9,但是MOD(18,9)=0,显然是和结果不符,错误在最后的余数为0应该变为9,即可,那么修正我们的思路:结果=MOD(正整数-1,9)+1,这样就可以避免了余数为0时出现的错误了,那么就可以了吗?我们看下面的截图:
为什么会出现一个错误呢?我们分析一下原因,公式本身没问题,那么我们找函数MOD的定义了,我们再次复习一下MOD函数。
MOD函数是一个求余函数,其语法为: MOD(number,divisor),即是两个数值表达式作除法运算后的余数。特别注意:在EXCEL中,MOD函数是用于返回两数相除的余数,返回结果的符号与除数(divisor)的符号相同。参数 Number 为被除数,Divisor 为除数。如果 divisor 为零,函数 MOD 返回值为#DIV/0!。说明:函数MOD可以借用函数 INT 来表示:MOD(n, d) = n - d*INT(n/d),我们再仔细的查找一下原因,收集一些资料会清楚,对于上述公式中的number与divisor的商原来有个取值范围,就是要求此数值应小于2的27次幂。哦,原来如此!9*2^27=1207959552,所以上述截图出现了错误。
那么问题来了,如何去解决这个问题呢?为此,我们引入一个indirect函数。
INDIRECT函数是 Excel 中的公式,此函数立即对引用进行计算,并显示其内容。当需要更改公式中单元格的引用,而不更改公式本身时,请使用此函数。
INDIRECT为间接引用,语法INDIRECT(ref_text,[a1])。参数Ref_text 为对单元格的引用,一种加引号,一种不加引号。
=INDIRECT("A1")——加引号,文本引用——即引用A1单元格所在的文本。
=INDIRECT(A1)——不加引号,地址引用——如果A1的值为B2,B2的值又等于11,那么返回11。
好了,不要再过多的看上面的公式了,只要知道是一种引用就可以了。
我们还需要复习一下SUMPRODUCT函数。
SUMPRODUCT函数,返回相应的数组或区域乘积的和。数组参数必须具有相同的维数,否则,函数 SUMPRODUCT 将返回错误值 #VALUE!。
语法SUMPRODUCT(array1,array2,array3, ...)Array1,array2,array3, ... 为 2 到 30 个数组,其相应元素需要进行相乘并求和。
下面来看为了实现我们的目的,需要录入的公式:
=MOD(SUMPRODUCT(--(MID(A2,ROW(INDIRECT("1:" & LEN(A2))),1)))-1,9)+1
看公式的截图
公式解释:INDIRECT("1:" & LEN(A2) 返回“$1:$10”
ROW(INDIRECT("1:" & LEN(A2)) 返回{1,2,3,4,5,6,7,8,9,10}数组
MID(A2,ROW(INDIRECT("1:" & LEN(A2))),1)返回—{1;2;0;7;9;5;9;5;5;5;2}
SUMPRODUCT(--(MID(A2,ROW(INDIRECT("1:" & LEN(A2))),1)))-1返回45-1
MOD(SUMPRODUCT(--(MID(A2,ROW(INDIRECT("1:" & LEN(A2))),1)))-1,9)+1返回9
好了,就是说是利用了数组,回避了数组过大的问题。
看下面的输出结果:
没有再出现问题,这样问题就完美的解决了。
今日内容技巧提示:
1、INDIRECT函数的引用。
2、SUMPRODUCT函数的用法。
3、MOD函数的局限。