C语言编程逆序数1234,用c语言编程求一个数的逆序数?

7330c3fb5c7f175b29004b8c2902e0e9.png

2018-04-25

用伴随矩阵的方法求矩阵的逆的C语言编程实现

//源程序如下#include#include#include#include#include#include#define max 100void inputstyle(int *); //输入函数void input(int **,int); //输入函数long danx(int **,int);int sgnx(int);void martx(int **,int);int main(void){ int style=0,i=0; int matrix[max][max],*p[max]; for(i=0;i>exit1; fflush(stdin); printf("...全部

//源程序如下#include#include#include#include#include#include#define max 100void inputstyle(int *); //输入函数void input(int **,int); //输入函数long danx(int **,int);int sgnx(int);void martx(int **,int);int main(void){ int style=0,i=0; int matrix[max][max],*p[max]; for(i=0;i>exit1; fflush(stdin); printf("

"); } return(0);} void input(int **p,int n){ for(int i=0;imax); }long danx(int **p,int n){ int i=0,j1=0,k1=0,j2=0,k2=0; long sum=0; int operate[max][max],*po[max]; for(i=0;i else{ for(i=0;i for(j1=1,j2=0;j1 k1=-1;k2=-1; while(k2 k1 ; k2 ; if(k1==i)k1 ; *(*(po j2) k2)=*(*(p j1) k1); } } /*for(int i1=0;i1 for(int h1=0;h1 printf("(%d,%d)%d ",i1,h1,*(*(po h1) i1)); } printf("

"); }*/ sum =*(*(p 0) i) * sgnx(1 i 1) * danx(po,n-1); } return sum; }}int sgnx(int i){ if(i%2==0)return(1); else return(-1);}void martx(int **p,int n){ int i=0,j=0,j1=0,k1=0,j2=0,k2=0,num=0; int tramform[max][max]; int operate[max][max],*po[max]; for(i=0;i num=danx(p,n); if(num==0)printf("矩阵不可逆

"); else{ if(n==1)printf("矩阵的逆为: 1/%d

",num); else{ printf("矩阵的逆为: 系数 1/%d *

",num); for(i=0;i for(j=0;j j1=-1;j2=-1; while(j2 j1 ;j2 ; if(j1==j)j1 ; k1=-1;k2=-1; while(k2 k1 ; k2 ; if(k1==i)k1 ; *(*(po j2) k2)=*(*(p j1) k1); } } tramform[i][j]=sgnx(2 i j) * danx(po,n-1); } } for(i=0;i for(j=0;j printf("M",tramform[i][j]); } printf("

"); } } }}//运行结果//希望对你有帮助。

收起

可以使用归并排序来统计逆序数,具体步骤如下: 1. 将组分为两个子组,分别递归地对子组进行排序。 2. 将两个排好序的子组合并成一个有序的组,并同时统计逆序数。 3. 返回排序好的组以及统计出的逆序数。 下面是使用归并排序统计逆序数的C代码实现: ```c #include <stdio.h> // 统计逆序数 int merge(int arr[], int temp[], int left, int mid, int right) { int i = left; // 左半段组的起始下标 int j = mid + 1; // 右半段组的起始下标 int k = left; // temp组的起始下标 int count = 0; // 统计逆序数 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; count += (mid - i + 1); // 统计逆序数 } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (i = left; i <= right; i++) { arr[i] = temp[i]; } return count; } // 归并排序 int mergeSort(int arr[], int temp[], int left, int right) { int mid = 0; int count = 0; if (left < right) { mid = (left + right) / 2; count = mergeSort(arr, temp, left, mid); count += mergeSort(arr, temp, mid + 1, right); count += merge(arr, temp, left, mid, right); } return count; } int main() { int n, i; int arr[100]; int temp[100]; int count = 0; printf("请输入组长度: "); scanf("%d", &n); printf("请输入组元素: "); for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } count = mergeSort(arr, temp, 0, n - 1); printf("逆序数为: %d\n", count); return 0; } ``` 以上代码中,merge函用于将两个排好序的子组合并成一个有序的组,并同时统计逆序数;mergeSort函用于对组进行归并排序,并返回统计出的逆序数。在main函中,先读入组长度和元素,然后调用mergeSort函统计逆序数并输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值