当前位置: 代码迷 >> C语言 >> 求助分析:从键盘输入一个正整数,将该正整数中的每位数字重新排列,输出最 ...
  详细解决方案

求助分析:从键盘输入一个正整数,将该正整数中的每位数字重新排列,输出最 ...

热度:809   发布时间:2007-12-06 11:28:51.0
我自己编了一下...可以将数字的各位分离出来....并求出最大和最小值..不过这个小程序只能处理INT型数据....如果想处理LONG等..自己再看看吧...
#include <stdio.h>
#include <stdlib.h>    //使用itoa,将一整型数转化成字符串
#include <string.h>
#include <math.h>

int main()
{
    const int ARRAY_SIZE = 20;
    int value,length,max,min;
    char buffer[ARRAY_SIZE];
    int num[ARRAY_SIZE];

    printf("Please enter one number:");
    scanf("%d",&value);

    length = strlen(itoa(value,buffer,10));

    for(int i=length-1; i>=0; i--)
    {
        num[i] = value / (int)pow(10,i);
        value = value % (int)pow(10,i);
        printf("%d\t",num[i]);
    }
    printf("\n");
    max = num[0];
    min = num[0];
    for(i=length-1; i>0; i--)
    {
        if(max < num[i])
            max = num[i];
        if(min > num[i])
            min = num[i];
    }
    printf("THe min number is: %d\nThe max number is: %d\n",min,max);

    return 0;
}
----------------解决方案--------------------------------------------------------
LZ```要知道你输入的一个整数```有多少位不知道````

如果从键盘输入```你又何必去想``怎么拆开它呢````
使用``getchar( )``不就等于把数拆开了吗````
然后你要做什么操作就不知道````有需要```你可以 getchar()-'48' ```

如果是用函数的功能实现``那么上面的办法肯定就不能用了``

我提供的方法是  一个循环```  n是要拆的数p指向一个数组```
void chaishu (  long  n  ,  int  *p  )
{
       while ( n )
       {
             *p++  =  n%10  ;
              n  /= 10 ;
       }
       return ;
}
----------------解决方案--------------------------------------------------------
楼上的那位,你上面的程序是否看懂了啊....?程序能处理任意长度的整形数....如果要用函数封装,你的那个办法可行么...函数需要的参数是一个整数哦...你那样可以么....
以上是本人的看法...
----------------解决方案--------------------------------------------------------
汗了

while(num)
{
    data[num%10]++;
    num/=10;
}

然后要最大的则从9开始循环,要最小则从1开始循环(记得从1开始得到一个数后要回到0处循环)
比如
0 1 2 3 4 5..
2 0 3 0 1..
得到的结果是200224..
----------------解决方案--------------------------------------------------------
不用那么复杂哟

要每一位的数字吧

int main()
{
int i=0
char a[100]={0};
gets(a);
while(a[i++]);
i-=2;
//a[0]就是最高位 a[i]就是个位
return 0;
}
----------------解决方案--------------------------------------------------------
看热闹
----------------解决方案--------------------------------------------------------
实验了N天,今天终于有了灵感,搞定了。大家看看我的程序,给点意见,谢谢大家.

#include <stdio.h>
#include <string.h>

main ()
{
    char num[11] ,temp ; //定义一个数组存储输入的数字,这样方便取得数字长度
    short i, j, a, a2 ;
    scanf("%s",num);
    a=strlen(num);   //用一个函数求得数字(字符串)长度,方便下面循环使用
    a2=a-1;          //用于排序

    for (i=1; i<a; i++)  //我只会用冒泡法排序,在这里用这个方法排序(不过据说冒泡法是最笨的)
    {
        for (j=0; j<=a2-i; j++)
        {
            if (num[j] > num[j+1])
            {
                temp=num[j]; num[j]=num[j+1]; num[j+1]=temp;
            }
        }
    }

    for (i=0; i<a; i++)           //输出最小数
    {
        printf("%c",num[i]);
    }
    printf("\n");

    for (i=a2; i>=0; i--)         //输出最大数
    {
        printf("%c",num[i]);
    }
    printf("\n");

}
----------------解决方案--------------------------------------------------------
下午别人指点说,求最大数不用排序,所以又有一招,程序如下,请再指点,谢谢。

#include <stdio.h>
#include <string.h>

main ()
{
    char num[11] ; //定义一个数组存储输入的数字,这样方便取得数字长度
    short a, i, max, min;
    scanf("%s",num);
    a=strlen(num);   //用一个函数求得数字长度,方便下面循环使用

    for (i=0; i<a; i++)  //打印最大数
    {
        max=(num[i]>num[i+1]) ? num[i] : num[i+1];

        printf("%d",max);
    }
    printf("\n");

    for (i=0; i<a; i++)   //打印最小数
    {
        min=(num[i]<num[i+1]) ? num[i] : num[i+1];

        printf("%d",min);
    }
    printf("\n");
}
----------------解决方案--------------------------------------------------------
应该要排序哦    你那只能输出每2个数间的最大或最小数值啊

[[italic] 本帖最后由 叶柄 于 2007-12-8 20:35 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
任意位数 (前提是你的内存够用...)
#include <stdio.h>
#include<stdlib.h>
typedef struct nod
{
        char ch;
        struct nod *next;
}linklist;
void main (void)
{   
        int count=0,i=0,j=0;//位数
        char ch,*newch,temp;
        linklist *head,*p,*rear;
    head=NULL;
        rear=head;
        p=head;
        scanf("%c",&ch);
        while(ch>47&&ch<58)//输入
        {
                count++;//计数
                if(NULL==head)
                {
                        p=(linklist*)malloc(sizeof(linklist));
                        p->ch=ch;
                        head=p;
                        head->next=NULL;
                        rear=head;
                }
                else
                {
                        p=malloc(sizeof(linklist));
                        p->ch=ch;
                        rear->next=p;
                        rear=p;
                        rear->next=NULL;
                }
                scanf("%c",&ch);
        }
        rear=head;
        newch=calloc(count+1,sizeof(char));//链表排序没用过 呵呵 转化为数组
        for(i=0;i<count;i++)
        {
                p=rear;
                newch[i]=rear->ch;
                rear=rear->next;
                free(p);
        }
        newch[count]='\0';
        for(i=0;i<count;i++)  //冒泡
    {
                for (j=0; j<count-i; j++)
        {
                        if (newch[j] > newch[j+1])
                        {
                                temp=newch[j];
                                newch[j]=newch[j+1];
                                newch[j+1]=temp;
                        }
                }
        }
        for (i=0; i<count; i++)           //输出最小数
    {
        printf("%c",newch[i+1]);
    }
           printf("\n");

    for (i=count-1; i>=0; i--)         //输出最大数
    {
                printf("%c",newch[i+1]);
    }
        printf("\n");

}

[[italic] 本帖最后由 叶柄 于 2007-12-9 13:17 编辑 [/italic]]
----------------解决方案--------------------------------------------------------