算法初步:逆序数

问题描述
在线性代数里有这么一个概念:有一个数列,如21543,
1的前面有1个数比它要大,4的前面有1个数比它大,
3的前面有2个数比它大,总数是1+1+2=4
所以21543的逆序数就是4

输入
多组测试数据,第一行是n(1<=n<=1e7),下一行是一个长度为n的字符串

输出
算出这个字符串的逆序数(ASCII比较)

样例输入
5
21543
3
123
6
654321
4
acdb
6
abcABC
4
2211

样例输出
4
0
15
2
9
4

难度:☆

代码实现如下:
 1 #include<iostream>
 2 using namespace std;
 3 int main(void)
 4 {
 5     int i,n,Sum;
 6     while(cin >> n)
 7     {
 8         cin.get();//为什么呢?
 9         Sum = 0;
10         char *str = new char[n];
11         for(i=0;i < n;i ++)
12         {
13             int j;
14             cin.get(str[i]);//与str[i] = cin.get()相同效果
15             for(j= 0;j < i;j ++)
16             {
17                 if(str[j] > str[i])
18                 {
19                     Sum ++;
20                 }
21             }
22         }
23         cout << Sum << endl;
24         delete [] str;
25     }
26     return 0;
27 }

点评:主要使用了一个函数cin.get(),以前还真没有接触过。它的主要特点是保留回车在输入流队列中,输入A,会按A 回车,cin.get()会把回车('\n')当作字符读了。所以在cin后,又加了一个cin.get().
posted @ 2009-05-18 15:37  Haven  阅读(1111)  评论(0编辑  收藏  举报