编写程序,任意输入一个正整数,输出其各位数字重排后最小的整数。 例如: 输入:2017输出127?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写程序,任意输入一个正整数,输出其各位数字重排后最小的整数。 例如: 输入:2017输出127?相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
int main()
int f=0,i,a[i],j,m,b;

scanf("%d",&m);
for(i=0;i<10;i++)
a[i]=m%10;
m=m/10;
f++;
if(m==0) break;
for(i=0;i<f;i++)
for(j=f-1;j>i;j--)
if(a[j]<a[j-1])
b=a[j-1];
a[j-1]=a[j];
a[j]=b;
for(i=0;i<f;i++)
printf("%d",a[i]);
printf("\n");


我现在写的这个程序运行之后输入2017 结果是0127,怎么才能在这段代码上改动让它输出结果为127

一行就能完成的,你们这样忽悠题主真的好吗#include <stdio.h>
int main(int c,char** p)

return (c=getchar())!=EOF?main(c,p),putchar(c),0:0;
参考技术A 上面的题目是不是拗口呢?理解一下其实也不是很费解,比如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函数的局限。

C语言编程:寻找特殊整数

请编写一个程序寻找一种特殊整数:一个 n 位的正整数等于其各位数字的n次方之和。

例如:407=4×4×4+0×0×0+7×7×7。所以407就是一个特殊数。

输入:
正整数的位数n(n<=6)。

输出:
所有此n位特殊数。每个数占一行。若不存在符合条件的特殊数,则输出提示:“No output.”;若存在,则从小到大进行输出。

说明:
假设输入为4,在4位整数中,有3个4位的特殊数,则输出格式为(输出中的1111、2222和9999并不是4位特殊数,只是格式样例):

1111
2222
9999

#include
#include
main()

long
int
a,b,c,d,e,p;
int
n,i,x;
scanf("%d",&n);
a=pow(10,n-1);
b=(pow(10,n))-1;
d=pow(10,i);
c=a;
for(c=a;c<=b;c++)

for(i=n-1;i>=0;i--)

x=(c/d)%10;
e=e+x*x*x;

printf("%d\n",e);
if(e==c)

printf("%ld\n",e);
p=1;


printf("no
output.\n");

不知道你的代码是不是这样的?你看看,然后你的i没有初始化,i的值是多少啊,函数是顺序执行,你的i好像在for(i=n-1;i>=0;i--)才被赋值了。但d已经被fuck了,所以x
=
(c/d)%10,c也被fuck了。。。后面的就都被fuck了。。
参考技术A 你写得一塌糊涂 给你重写一个吧
#include <stdio.h>
int pow(int x, int y)

int ret;
int i;
for(i=1,ret=1;i<=y;i++)

ret *= x;

return ret;

int main()

int top;
int buttom;
int n;
int i;
int j;
int a[6];
int tmp;
int sum;
int count;
printf("input n:\n");
scanf("%d", &n);
for(i=1,top=0;i<=n;i++)

top = top*10 + 9;

for(i=1,buttom=1;i<=n-1;i++)

buttom = buttom*10;

for(i=buttom,count=0;i<=top;i++)

for(j=0,tmp=i,sum=0;j<n;j++)

a[j] = tmp%10;
sum += pow(a[j],n);
tmp /= 10;

if(i==sum)

printf("%d\n",i);
count++;


if(count==0)

printf("No output\n");

return 0;
追问

你这个是C语言程序吗?
不是应该:int main() 吗?
不过答案是对的。。。

追答

前面定义个计算 整数幂运算的函数 pow
下面 有 int main()

参考技术B 定义那么多的int类型的变量这样写累吗?

以上是关于编写程序,任意输入一个正整数,输出其各位数字重排后最小的整数。 例如: 输入:2017输出127?的主要内容,如果未能解决你的问题,请参考以下文章

java编写一个程序,用户输入一个正整数,把它的各位数字颠倒一下,并输出颠倒后结果

利用JAVA从键盘输入一个任意整数后怎么求各位数字之和?

C语言中任意输入一个整数 编一个程序输出整数长度 能不能有解法

c编程任意输入一个整数,要求计算并输出此整数的各位数字之和。如:231的各位之和是2+3+1。

编写程序:输入一个4位的整数,然后分别输出组成改4位数的各位数字。

java编程怎么完成任意输入一个正整数,反序输出每一位?