首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于逆序数的程序 大神来帮小弟我改改吧 异常太多小弟我实在是改不完了

2013-01-08 
关于逆序数的程序大神来帮我改改吧错误太多我实在是改不完了倒是没有语法上的错误只是运行起来结果不对有

关于逆序数的程序 大神来帮我改改吧 错误太多我实在是改不完了
倒是没有语法上的错误   只是运行起来结果不对
有关于逆序数   1234的逆序数=0   1324逆序数=1   反正就是后一位的数和前面的比较
2 4 3 1 5    4之前有0个  3之前有1个 1之前有3个 5之前有0个所以逆序数就是1+3=4
然后我的程序是要输入十个数  然后输出他们各自的逆序数 
下面是一直改不好的程序关于逆序数的程序  大神来帮小弟我改改吧  异常太多小弟我实在是改不完了    

#include<stdio.h>
#define N 10
int main()
{
int a[N],c,*p,e,i,f,d[N][4],j,h;
c=0;f=0;
    p=&a[0];   //p=a一样
printf("请定义十个数(每个数的值限制在10000以内):");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
     
for(i=0;i<=9;i++)                           //整体的十个数进入总循环体

    c=*p/10;
if(c=1)
{j=1;
printf("\na=%d,逆序数=0",*p);}
else 
{
for(j=1;c!=0;j++)                      
 {c/=10;                          //确定位数 
  f=*p%10;
         
  d[i][j]=f;}                //第几个数的第几位是多少用二维数组储存
for(j=0;j<4;j++)
         if(d[i][j]>d[i][j+1])
 h=h;
 else 
 h++;
 
 printf("\na=%d,逆序数=%d",*p,h);

 *p++;}
      
}




return(0);
}

[解决办法]
    // o(nlogn) 逆序数  
    #include <stdio.h>  
    #include <string.h>  
    #include <stdlib.h>  
    int Calc(int* a, int* b, int first, int last) {  
        if(first >= last) return 0;  // 一个元素的情况下没有逆序数  
         int i,j,k=0,mid,res=0;  
         k=i=first;  
         mid=(first+last)/2;  
         j=mid+1;  
         res=Calc(a,b,i,mid)+Calc(a,b,j,last);  // 递归计算两边的逆序数  
         // 计算两边相关联的数据的逆序数  
         while((i<=mid) && (j<=last)) {  
            if(a[i]<a[j]) b[k++]=a[i++],res+=j-mid-1;  
            else b[k++]=a[j++];   // 是不是没有考虑a[i]=a[j]的问题   
         }  
         while(i<=mid) b[k++]=a[i++],res+=j-mid-1;  
         while(j<=last) b[k++]=a[j++];  


        // memcpy(a+first,b+first,sizeof(int)*(first-last+1));  
         for(i=first; i<=last;++i)  
            a[i]=b[i];  
         return res;  
    }  
    int main() {  
        int n;  
        scanf("%d",&n);  
        int* a=(int*) calloc(n, sizeof(int));  
        int* b=(int*) calloc(n, sizeof(int));  
        int i=0;  
        for(i=0;i<n;++i) {  
            scanf("%d",(a+i));  
        }  
        printf("%d/n",Calc(a,b,0,n-1));  
        // system("pause");  
        return 0;  
    }   



参考一下这个代码, 分治法求解的
[解决办法]
逆序数
http://baike.baidu.com/view/184395.htm

看看這個簡單的吧,然後自己重寫一個关于逆序数的程序  大神来帮小弟我改改吧  异常太多小弟我实在是改不完了


#include<stdio.h>
#define N 10
//求逆序數
int get_inversion(int *arr, int size)
{
  int sum = 0;
  for(int i = 0; i < size; ++i)
  {
    for(int j = i+1; j < size; ++j)
    {
      if(arr[i] > arr[j])
      {
        ++sum;
      }
    }
  }
  return sum;
}
int main()
{
  int a[N],c,*p,e,i,f,d[N][4],j,h;
  c=0;f=0;
  p=&a[0];   //p=a一样
  printf("请定义十个数(每个数的值限制在10000以内):");
  for(i=0;i<N;i++)
    scanf("%d",&a[i]);

  printf("序列: ");
  for(i=0;i<N;i++)
    printf("%d, ",a[i]);

  printf("逆序数=%d\n", get_inversion(a, N));

  return 0;
}

热点排行