| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1276 人关注过本帖
标题:[求助]请大家帮我看看这个程序
只看楼主 加入收藏
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
结帖率:87.5%
收藏
 问题点数:0 回复次数:16 
[求助]请大家帮我看看这个程序
我这有个 测试是不是逆序数的程序,可是我有的地方看不懂,请大家帮我分析下,我先这在谢谢了!

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

#include <cstdio>

int main()
{
while(!scanf("%*d\n"))
{
// int c, i;
int s = 0, t, buf[256 * 2] = {0};
int *mipmap[] = {buf + 2, buf + 4, buf + 8, buf + 16, buf + 32, buf + 64, buf + 128, buf + 256};//这为什么这么定义?
while((t = getchar()) != '\n')
{
mipmap[7][t]++, t & 1 || (s += mipmap[7][t + 1]), t >>= 1;//这是什么意思?
mipmap[6][t]++, t & 1 || (s += mipmap[6][t + 1]), t >>= 1;
mipmap[5][t]++, t & 1 || (s += mipmap[5][t + 1]), t >>= 1;
mipmap[4][t]++, t & 1 || (s += mipmap[4][t + 1]), t >>= 1;
mipmap[3][t]++, t & 1 || (s += mipmap[3][t + 1]), t >>= 1;
mipmap[2][t]++, t & 1 || (s += mipmap[2][t + 1]), t >>= 1;
mipmap[1][t]++, t & 1 || (s += mipmap[1][t + 1]), t >>= 1;
mipmap[0][t]++, t & 1 || (s += mipmap[0][t + 1]);
/*
for (t = c, i = 0; i < 8; i++, t >>= 1)
{
mipmap[7 - i][t]++;
if (0 == (t & 1))
s += mipmap[7 - i][t + 1];
}
*/
}
printf("%d\n", s);
}
return 0;
}
搜索更多相关主题的帖子: int 逆序 
2007-09-05 15:27
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 
要是我,我绝对不这样写

直接2个for循环体就解决问题了

自我放逐。。。
2007-09-05 15:59
wsy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-9-2
收藏
得分:0 
我连1楼的都不会写 呵呵 2楼的大侠能 否百忙中抽出点时间写出 那两个FOR 循环 让我能学一下

2007-09-05 20:25
puying2008
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-4-28
收藏
得分:0 
#include<iostream.h>
void main()
{
static int count=0;
int a[5]={2,1,5,4,3};
for(int i=1;i<5;i++)
for(int j=0;j<i;j++)
{
if(a[j]>a[i]) count++;
}
cout<<count<<endl;
}
2007-09-05 22:08
puying2008
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-4-28
收藏
得分:0 

应该是这样才对:
#include<iostream.h>
void main()
{
static int count=0;
int n;
cout<<"Input the number of the array:"<<endl;
cin>>n;
int *p=new int[n];
cout<<"Intput the elments"<<endl;
for(int k=0;k<n;k++)
cin>>*p;

for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
if(p[j]>p[i]) count++;
}
delete [] p;
cout<<count<<endl;
}

2007-09-05 22:18
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
收藏
得分:0 
楼上的不对,请看清要求!

就你上面那组:21543

当i=3时,j 不是从0再开始比较!

请大家帮我看看那两句什么意思?从家这个程序时间复杂度小啊!还有编译程序时出现这个提示:
nixu.cpp:35:2:warning :no newline at end of file

就像1楼那个程序也会出现这个!怎么办,才能不出现这个?
2007-09-06 09:29
青格儿
Rank: 4
等 级:贵宾
威 望:11
帖 子:698
专家分:20
注 册:2007-7-31
收藏
得分:0 
/*
for (t = c, i = 0; i < 8; i++, t >>= 1)
{
mipmap[7 - i][t]++;
if (0 == (t & 1))
s += mipmap[7 - i][t + 1];
}
*/

这段是它的注释, 可是我还是看着迷惑!请各位朋友帮帮我,谢谢!
2007-09-06 09:45
virusswb
Rank: 1
等 级:新手上路
威 望:1
帖 子:342
专家分:0
注 册:2005-8-6
收藏
得分:0 
下面给个思路吧

int num=0;
for(int i=1;i<len(input);i++)
{
for(int j=0;j<i;j++)
{
if(input[j]>input[i])
num++;
}
}

jorden008@
2007-09-06 14:41
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
很明显,用两个for是不考虑效率的做法!

Fight  to win  or  die...
2007-09-06 20:44
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
收藏
得分:0 
以下是引用aipb2007在2007-9-6 20:44:48的发言:
很明显,用两个for是不考虑效率的做法!

你有什么更好的算法?


自我放逐。。。
2007-09-06 21:41
快速回复:[求助]请大家帮我看看这个程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012165 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved