C语言题(关于数组的),求解,能做几题就做几题。解决方法

C语言题(关于数组的),求解,能做几题就做几题。。。
1.【问题描述】

从键盘输入一个正整数(无符号长整型),将该正整数中的每位数字重新排列,分别组成一个最大数和一个最小数并依次输出,两数间用空格分隔。
【输入形式】

从键盘输入一个无符号长整型整数。
【输出形式】

输出最大数和最小数,两数间用空格分隔,最小数左端的0不应输出。

【样例输入】

47091

【样例输出】

97410 1479
2.
【问题描述】

从键盘输入10个整数,输出这10个数中仅出现一次的数。如果没有这样的数,则输出:None。
【输入形式】

从键盘输入10个整数。
【输出形式】

按出现的次序,输出该10个数中仅出现一次的数。如没有这样的数,则输出:None。

【样例输入】

-12 36 72 36 87 99 87 87 -12 -35

【样例输出】

72 99 -35
【样例输入】

-12 36 72 36 87 99 72 87 -12 99
3.
【问题描述】

编程,输入10个互不相等的正整数存入一维整型数组a中,要求对这10个数作相应的处理并按示例格式依次输出下列结果:
⑴ 最大值和最小值及其所在位置下标;
⑵ 平均值(保留1位小数);
⑶ 大于并最接近平均值的数及其所在位置下标;
⑷ 小于平均值的数的个数。
⑸ 10个数按从小到大的顺序排列。
【输入形式】

从键盘输入10个互不相等的正整数存入一维整型数组a中。
【输出形式】

按样例格式依次输出以下各行:
⑴ 最大值和最小值及其所在位置下标;
⑵ 平均值(保留1位小数);
⑶ 大于并最接近平均值的数及其所在位置下标;
⑷ 小于平均值的数的个数;
⑸ 10个数按从小到大的顺序排列。
【样例输入】

50 60 70 80 90 95 85 75 65 55

【样例输出】

Maximum: a[5]=95
Minimum: a[0]=50
Average: 72.5
Closest to: a[7]=75
Less than: 5
Sort: 50 55 60 65 70 75 80 85 90 95
4.
【问题描述】编程,从键盘按行输入4行5列的二维整型数组a的各元,且各元的值都互不相等,先找到并输出数组a中值最大的元素,输出格式为:a[下标1][下标2]=该数值。然后将数组a中值最大的元素所在的行和列分别与最后一行和最后一列互相交换,再按行输出数组a的各元。
【输入形式】
【输出形式】
【样例输入】

56 78 36 4 19

44 95 72 85 67

-3 32 29 21 47

88 7 66 53 40

【样例输出】

a[1][1]=95

56 19 36 4 78

88 40 66 53 7

-3 47 29 21 32

44 67 72 85 95
6.
【问题描述】编程序,依次从键盘输入一个字符串和不大于该字符串长度的正整数n,将该字符串尾部(右边)的n个字符按原顺序移到该字符串的头部(左边),然后输出处理后的该字符串。
【输入形式】
【输出形式】
【样例输入】

shjFfdui#$ AG&fjk*28(ruiXK@

10

【样例输出

*28(ruiXK@shjFfdui#$ AG&fjk

------解决方案--------------------
第一道 菜鸟 写得比较繁琐
C/C++ code

#include <stdio.h>
void main ()
{
    unsigned long a;
    int b[20]={0};
    int i=0,j,k,t;
    scanf("%d",&a);
    while (a)
    {
        b[i]=a%10;
        a/=10;
        i++;
    }
    printf("\n");
    for(j=0;j<i;j++)
        for (k=0;k<i;k++)
            if (b[k]<b[j])
            {
                t=b[j];                
                b[j]=b[k];
                b[k]=t;
            }
    for (j=0;j<i;j++)
    {
        printf("%d",b[j]);
    }
    printf("   ");
    for (j=i-1;j>=0;j--)
    {
        if (b[j]==0)continue;
        printf("%d",b[j]);
    }
    printf("\n");
}

------解决方案--------------------
C/C++ code
/*1.
【问题描述】从键盘输入一个正整数(无符号长整型),将该正整数中的每位数字重新排列,分别组成一个最大数和一个最小数并依次输出,两数间用空格分隔。
【输入形式】从键盘输入一个无符号长整型整数。
【输出形式】输出最大数和最小数,两数间用空格分隔,最小数左端的0不应输出。
【样例输入】47091
【样例输出】97410 1479*/

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

#define true 1
#define false 0

typedef unsigned int bool;
typedef unsigned long ulong;

//用最简单的冒泡排序,由小到大排序
void sort(int *datas,int len)
{
    int i,j,temp;
    bool change = true;
    for(i = len -1; i>0 && change; --i)
    {
        change = false;
        for(j = 0;j<i; ++j)
        {
          if(datas[j] >datas [j+1])
          {
              temp = datas[j];
              datas[j] = datas[j+1];
              datas[j+1] = temp;
              change = true;
          }
        }
    }
}


int main()
{
    ulong data;
    ulong max = 0,min = 0;
    int *datas = NULL;
    char chs[10];
    int i,len;
    printf("输入一个无符号长整型数: ");
    scanf("%ul",&data);
    _ultoa(data,chs,10);  //将ulong型转化为字符串 
    len = strlen(chs);
    datas = (int*)malloc(sizeof(int) * len);  //动态分配内存
    for(i = 0;chs[i] != '\0';++i)
      datas[i] = chs[i] - 48;   //将字符转化为数字 存到int型数组中
    //对数字内部数字进行排序
    sort(datas,len);
    for(i = 0;i<len;++i)
        min += (datas[i] * (int)pow(10,len-1-i));//min=1479l  l表示是long型
    for(i=len -1; i>=0;--i)
        max += (datas[i] * (int)pow(10,i));  //max = 97410l
    printf("max = %ul \n min= %ul\n",max,min);
    system("pause");
    return 0;
}