//
// 编程题
// 有一个数组 [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;
}