| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1501 人关注过本帖
标题:[Game]代码游戏 计算题
只看楼主 加入收藏
lin5161678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:17
帖 子:534
专家分:1958
注 册:2011-12-3
  得分:0 
以下是引用九转星河在2018-6-7 09:35:32的发言:

int comp( const void* p,const void* q )
{
    return *( char* )q-*( char* )p;
}


   memset(p,-1,b);

当然,没有处理负数,当然就算加入负数也差不多是这样子的~

这段代码 有几点问题

memset初始化 -1 其实不好
这样你希望用 comp把-1摆到最后面 需要依赖 char 是signed char
实际上 char 可能是 unsigned char
这时候 -1 就没交换到最后面了

直接初始化为 正数
然后升序处理
不用依赖char是有符号还是无符号



这里的 char* 是 unsigned char*
结果就错了

[此贴子已经被作者于2018-6-7 10:34编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2018-06-07 10:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
  得分:0 
回复 21楼 lin5161678
那我改改看~

程序代码:
#include<stdio.h>

int comp( const void*,const void* );
unsigned fun( unsigned,unsigned );
unsigned print( unsigned const char* );

int main( void )
{
    unsigned a;
    unsigned b;

    if (scanf("%u%u",&a,&b)!=2)
        return 1;

    printf("%u\n",fun(a,b));

    return 0;
}

int comp( const void* p,const void* q )
{
    return *( unsigned char* )p-*( unsigned char* )q;
}

#include<stdlib.h>
#include<string.h>
#include<assert.h>

unsigned fun( unsigned a,unsigned b )
{
    unsigned count;
    unsigned char* p=( unsigned char* )calloc(++a,b);

    assert(p);

    memset(p,255,b);

    qsort(p,a,b,comp);

    count=print(p);

    free(p);

    return count;
}

unsigned print( unsigned const char* p )
{
    unsigned i=0;

    while (*p++==0)
        ++i;

    return i;
}


就是把char改成unsigned char,嗯,这样就可以了,的确有些编译环境会把char自动默认成unsigned char,也就是char里面没有出现负数~

其实简单点的确不用考虑unsigned的问题,改两个地方就可以了~

程序代码:
#include<stdio.h>

int comp( const void*,const void* );
unsigned fun( unsigned,unsigned );
unsigned print( const char* );

int main( void )
{
    unsigned a;
    unsigned b;

    if (scanf("%u%u",&a,&b)!=2)
        return 1;

    printf("%u\n",fun(a,b));

    return 0;
}

int comp( const void* p,const void* q )
{
    return *( char* )p-*( char* )q;
}

#include<stdlib.h>
#include<string.h>
#include<assert.h>

unsigned fun( unsigned a,unsigned b )
{
    unsigned count;
    char* p=( char* )calloc(++a,b);

    assert(p);

    memset(p,1,b);

    qsort(p,( unsigned )(a,b,comp);

    count=print(p);

    free(p);

    return count;
}

unsigned print( const char* p )
{
    unsigned i=0;

    while (*p++==0)
        ++i;

    return i;
}


[此贴子已经被作者于2018-6-7 11:31编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-07 11:11
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
  得分:0 
当然还可以看看这个~

程序代码:
#include<stdio.h>

unsigned fun( unsigned,unsigned );

int main( void )
{
    unsigned a;
    unsigned b;

    if (scanf("%u%u",&a,&b)!=2)
        return 1;

    printf("%u\n",fun(a,b));

    return 0;
}

#include<stdlib.h>
#include<assert.h>

unsigned fun( unsigned a,unsigned b )
{
    FILE* fp;

    unsigned count;
    char* p=( char* )calloc(a,b);

    assert(p);

    if ((fp=fopen("test.txt","wb"))==NULL)
        exit(EXIT_FAILURE);

    fwrite(p,a,b,fp);

    free(p);

    count=ftell(fp);

    fclose(fp);

    remove("test.txt");

    return count;
}


[此贴子已经被作者于2018-6-7 11:25编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-07 11:12
lin5161678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:17
帖 子:534
专家分:1958
注 册:2011-12-3
  得分:0 
回复 22楼 九转星河
( unsigned )(-~( int )a)

一次 ++a 简单多了
2018-06-07 11:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
  得分:0 
回复 24楼 lin5161678
好,我等下再在原帖的基础上改,忘记可以用++了

~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-07 11:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
  得分:0 
话说,看看楼主还有没有我们没有提及到的好方法,顺便说出来参考一下也好~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-09 16:12
lin5161678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:17
帖 子:534
专家分:1958
注 册:2011-12-3
  得分:0 
    int m, n;
    scanf("%d%d", &n, &m);
    printf("%d\n", sizeof(char[n][m]));    


    int m, n;
    scanf("%d%d", &n, &m);
    printf("%d\n", ((char(*)[n][m])0)+1);    


基本是利用VLA
还有一些和你想一样的
比如循环++

你用函数处理的几个是我没想到的
脑洞大
2018-06-11 17:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
  得分:0 
以下是引用lin5161678在2018-6-11 17:14:51的发言:

    int m, n;
    scanf("%d%d", &n, &m);
    printf("%d\n", sizeof(char[n][m]));   

    int m, n;
    scanf("%d%d", &n, &m);
    printf("%d\n", ((char(*)[n][m])0)+1);   


基本是利用VLA
还有一些和你想一样的
比如循环++

你用函数处理的几个是我没想到的
脑洞大

看过,这应该是C99才支持的吧~
我那个编译器还不支持C99,结果无论输入什么,总是输出0和4(不要笑是编译器的问题),这个知道一下就可以了~

[此贴子已经被作者于2018-6-11 18:26编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-11 18:25
快速回复:[Game]代码游戏 计算题
数据加载中...
 
   



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

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