| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1373 人关注过本帖
标题:长字符串/数据的输入
只看楼主 加入收藏
a1294549175
Rank: 1
等 级:新手上路
帖 子:17
专家分:8
注 册:2017-1-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
长字符串/数据的输入
新人求解,刷题时遇到了这种东西:

    输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000

老是报错,结果最后发现DOS窗口一次输入最多4096个字符,好像还和分区什么的有关系,求解输入的办法。
搜索更多相关主题的帖子: 字符串 正整数 
2017-01-12 23:26
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:5 
字符输入一个收一个,输入10个收10个,收够为止,这样应该可以收得好多吧?

[此贴子已经被作者于2017-1-13 07:22编辑过]

2017-01-13 07:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:5 
别人未必是通过手工打键盘输入的,你只要将代码写正确就行了。
自我测试的话,你也不需要测试100000位;一定要测试100000位的话,你可以用控制台的重定向,比如控制台下输入 a.exe < in.txt > out.txt
2017-01-13 08:31
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:5 
一般OJ平台测试,如果答案不正确都会告知是什么错误,比如“运行超时”“答案错误”“段错误”等等。。

我怀疑是不是你的解题思路有问题。。把代码发上来瞅瞅。
长度十万的十六进制数转换为二进制数最长可能是30万。这个字符串的空间楼主给够了吗?

现DOS窗口一次输入最多4096个字符  这个你不用担心,平台测试都是用的文件读写,不存在这个桎梏。那他给出的测试代码中一定会有一个长度为十万的十六进制数需要你转换,就是测试你的程序健壮性有没有满足要求。如果你想自己试试,可以参照楼上risp版主的方法(或者参考http://bbs.

φ(゜▽゜*)♪
2017-01-13 09:39
a1294549175
Rank: 1
等 级:新手上路
帖 子:17
专家分:8
注 册:2017-1-12
收藏
得分:0 
回复 4楼 书生牛犊
可是不知道为什么我自己用文件输入,就能输出正确结果

代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

#define N 100000

int main()
{
    int i,n,j;

    void func1();

    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)
        func1();

    return 0;
}

void func1()
{
    long int len,i,j,n,s;
    char a[N]={0},b[4*N]={0},c[2*N]={0},t[N]={0};
   
    for(i=0;1;i++)
    {
        t[i]=getchar();
        if(t[i]=='\n') {t[i]='0';break;}
    }

    len=strlen(t);

    for(i=0;i<len;i++)
    {
        a[len-i-1]=t[i];
    }

    for(i=0;i<len;i++)
    {
        if(a[i]>='0'&&a[i]<='9') a[i]-='0';
        else if(a[i]>='A'&&a[i]<='Z') a[i]-='A'-10;
        else {printf("ERROR!!!\n");exit(0);}

        b[i*4]=a[i]%2;
        b[i*4+1]=a[i]/2%2;
        b[i*4+2]=a[i]/4%2;
        b[i*4+3]=a[i]/8;
    }

    len=(float)len*4/3+1;

    for(i=0;i<len;i++)
    {
        c[i]=b[i*3]+b[i*3+1]*2+b[i*3+2]*4;
    }

    for(i=2*N-1;i>=0;i--)
        if(c[i]!=0) break;

    for(;i>=0;i--)
        printf("%d",c[i]);

    printf("\n");
}

[此贴子已经被作者于2017-1-13 12:56编辑过]

2017-01-13 12:34
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
4096~~估计用getchar()输入保存在缓冲区的空间大小有限,在文本中读入不会出现这个问题~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-13 14:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
如果字符串长度100000,感觉16进制的数转换成2进制,4进制,8进制问题不大~但如果16进制的数转换成其它进制的数例如10进制的数,好像要涉及到大位数运算了,感觉很麻烦~

看楼主的题目要求具体进制转换不太明确~5楼测试代码输出似乎有点问题(前后两组测试数据输入相同,输出不同,似乎是数据重置问题)~不知道原意是怎么样的呢~


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-13 14:31
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
真的会没错吗?
程序代码:
void func1()
{
    long int len,i,j,n,s;
    char a[N]={0},b[4*N]={0},c[2*N]={0},t[N]={0};
  

    for(i=0;1;i++)
    {
        t[i]=getchar();
        if(t[i]=='\n') {t[i]='0';break;}/*t[i]应该写入‘\0’吧!*/
    }

len=(float)len*4/3+1;/*这条式子可能并不能如你所愿的计算得到应得到的数字,建议改成len=len*4.0/3+1 (整形和浮点运算时会自动转化为精度更高的那个)*/

图片附件: 游客没有浏览图片的权限,请 登录注册
(没有一个测试结果是正确的。。。)



[此贴子已经被作者于2017-1-13 20:05编辑过]


φ(゜▽゜*)♪
2017-01-13 19:51
a1294549175
Rank: 1
等 级:新手上路
帖 子:17
专家分:8
注 册:2017-1-12
收藏
得分:0 
感谢各位大神,错找出来了
当OJ平台输入长度为100000时,可用于接受的数组的长度只有100000,会导致后续“\0”储存时发生越位的问题,增加一位数组就好了
程序通过了
2017-01-13 23:56
a1294549175
Rank: 1
等 级:新手上路
帖 子:17
专家分:8
注 册:2017-1-12
收藏
得分:0 
回复 8楼 书生牛犊
这个...
好像影响不是非常大的,不过还是谢谢啦
2017-01-13 23:57
快速回复:长字符串/数据的输入
数据加载中...
 
   



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

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