结构化程序设计:输入一个正整数(不超过5位数),输出由该数的各位能表示的最大数和最小数。

结构化程序设计:输入一个正整数(不超过5位数),输出由该数的各位能表示的最大数和最小数。

思路

  首先将正整数分拆得到各个位上的数字,对这些数字按从小到大排序,再考虑按照乘权求和的方式转换成相应的整数既可得到最大最小结果

代码

#include <stdio.h>
#include <string.h>
void split(int x,int a[],int *count);
void sortA(int a[],int count);
void getMaxMin(int a[],int count,int *max,int *min);
int main()
{
    int x,a[5],count=0,max,min;
    scanf("%d",&x);
    split(x,a,&count);//分离x各位数到数组a中,count利用指针传递给函数,使它能记录x的位数
    sortA(a,count);//对数组a进行排序
    getMaxMin(a,count,&max,&min);//根据乘权求和算法,对已排好序的数组a分别从大到小和从小到大计算最大最小值
    printf("max=%d,min=%d",max,min);//输出结果
}

void split(int x,int a[],int *count)
{
	 /*x是你输入的值,a是将x所有位分离出来存放的数组,指针count指向main函数的count变量,用于记录x的位数*/
    while(x)
    {
        a[*count]=x%10;
        x/=10;
        (*count)++;
    }
}

void sortA(int a[],int count)
{
	 /*对数组a进行排序,选择排序或冒泡排序均可,count是数组a实际的元素个数,即x的位数*/
    int i,j,k,tmp;
    for(i=0;i<count-1;i++)
    {
        k=i;
        for(j=i+1;j<count;j++)
            if(a[j]<a[k])k=j;
        if(k!=i)tmp=a[i],a[i]=a[k],a[k]=tmp;
    }
}

void getMaxMin(int a[],int count,int *max,int *min)
{
	 /*a是已经排好序的数组,指针max和min分别指向main函数中的max变量和min变量,用于将两个结果带回main函数*/
    int i;
    *max=*min=0;
    for(i=0;i<count;i++)
    {
        *min=*min*10+a[i];
        *max=*max*10+a[count-i-1];
    }
}

分析

  直接写代码十分复杂,所以我们将问题的解决分成三个部分

1.分离x各位数到数组a中

void split(int x,int a[],int *count)
{
	 /*x是你输入的值,a是将x所有位分离出来存放的数组,指针count指向main函数的count变量,用于记录x的位数*/
    while(x)
    {
        a[*count]=x%10;
        x/=10;
        (*count)++;
    }
}

2.对数组a进行排序

void sortA(int a[],int count)
{
	 /*对数组a进行排序,选择排序或冒泡排序均可,count是数组a实际的元素个数,即x的位数*/
    int i,j,k,tmp;
    for(i=0;i<count-1;i++)
    {
        k=i;
        for(j=i+1;j<count;j++)
            if(a[j]<a[k])k=j;
        if(k!=i)tmp=a[i],a[i]=a[k],a[k]=tmp;
    }
}

3.根据乘权求和算法,对已排好序的数组a分别从大到小和从小到大计算最大最小值

void getMaxMin(int a[],int count,int *max,int *min)
{
	 /*a是已经排好序的数组,指针max和min分别指向main函数中的max变量和min变量,用于将两个结果带回main函数*/
    int i;
    *max=*min=0;
    for(i=0;i<count;i++)
    {
        *min=*min*10+a[i];
        *max=*max*10+a[count-i-1];
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值