编程题练习1

 

//
//    编程题
//  有一个数组 [5, 8, 12, 18, 123]  按数字和,从小到大排序。结果: [12, 5, 123, 8, 18]  (1+2 <5 , 所以 12在5之前)    
    
    
typedef struct num * NUM;
struct num
{
    int  title[5];//存储需要比较的数值(5,8,12,18,123)
    int  jibie[5];//记录分析出的大小(5,8,3,9,6),分析数值大小。 
} Num;

int b[5];   //设置b为全局变量数组
// 冒泡排序算法
void bubbleSort(struct num *arr, int n) { //传入结构体进行比较
    //   for(int n=0;n<5;n++)
    //   {
    //   printf("%4d",arr->title[n]);
    //   printf("%4d",arr->jibie[n]);
    //   }
    for (int i = 0; i<n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
    {
        //如果前面的数的分析数值比后面大,进行交换
        if (arr->jibie[j] > arr->jibie[j + 1]) {
            int temp = arr->title[j]; arr->title[j] = arr->title[j + 1]; 
            arr->title[j + 1] = temp;//交换数值
            int temp2 = arr->jibie[j]; arr->jibie[j] = arr->jibie[j + 1]; 
            arr->jibie[j + 1] = temp;//交换分析数值

        }//同时交换数值和它的分析数值
    }



    for(int n=0;n<5;n++)
        printf("%4d",arr->title[n]);

}

void fun(int *p){

    // printf("%d",*p);
    //printf("%d", 123/100);
    for(int i=0,m=0;i<5;i++,m++)
    {   
        int chushu=1, weishu; //chushu用来记录商,weishu记录输入数值的位数
    
         //下面的for循环用来求出输入数值的位数(例如:5 1位, 12 2位, 123 3位)
        for(int j=1;chushu!=0;weishu++)
        {     j=j*10;
         chushu=p[i]/j;   //当chushu为0时,循环结束,weishu记录输入数值的位数
        }
        
        //(5,8,12,18,123)对应的位数为(1,1,2,2,3)
        
        // printf("%3d",weishu);
        
        weishu--;  //将所得位数减一  (0,0,1,1,2)
        int sum=0; 
        //  printf("%3d",weishu);
        if(weishu==0)
            b[i]=p[i];    //如果位数为0,直接将p[i]值赋予b[i],

        else{
            
            int total=0,pre=0; //total记录商值,pre用来保留改变前的p[i]值
            
            for(; weishu!=0;weishu--)//位数不为0,在此循环运行
            {   
                int chushu2=(int)(pow(10,weishu));   //  pow()为平方函数,pow(10,2)的100.
                                                     //chushu2记录除数
                //  printf("%3d",chushu2);

             {  
              total=p[i]/chushu2;
              p[i]=p[i]-(p[i]/chushu2)*(int)(pow(10,weishu));
              pre=p[i];
              //   printf("%3d",p[i]);
              sum=sum+total;
              //   printf("%3d",sum);
             }
                
                //上一部分代码所做的操作是:
                //例如: 123   , 位数减一后是2, chushu2=(int)(pow(10,2)), chushu2=100;
                //total=123/100,    total=1;
                //pre=p[i]=123-(123/100)*100=23;
                //sum=sum+1, sum=1 ,  一次循环结束, weishu减一,weishu为1
                //第二次循环
                //total=23/10, total=2, chushu2=(int)(pow(10, 1)), chushu2=10;
                //pre=p[i]=23-(23/10)*10=3;
                //sum=sum+2; sum=3,  weishu减一,weishu为0,退出循环

            }

            b[i]=sum+pre;   //当分析123时, b[i]=sum+pre=3+3=6
            
            //  printf("%4d",b[i]);
        }


    }
    //     for(int n=0;n<5;n++)
    //          printf("%4d",b[n]);

    return b;//返回分析数组
}    

int main () {
    int a[5]={5,8,12,18,123};
    int c[5];
    for(int j=0;j<5;j++)
    {
        c[j]=a[j];
    }
    fun(a);
    //  for(int n=0;n<5;n++)
    // //  printf("%4d",b[n]);

    struct num number;    //定义结构体变量number
    for(int i=0;i<5;i++)
    {
        number.title[i]=c[i];//将a数组值存入
        number.jibie[i]=b[i];//将分析数组值存入
    }
    //   for(int n=0;n<5;n++)
    //   {
    //   printf("%4d",number.title[n]);
    //   printf("%4d",number.jibie[n]);
    //   }

    NUM *p=&number;  
    bubbleSort(p,5);//将结构体传参


    return 0;
}

 

 

posted @ 2020-05-24 00:32  liweikuan  阅读(138)  评论(0编辑  收藏  举报