我遇到以下问题:
我的工作是编写一个程序,该程序采用通过stdin传递给它的无符号整数,并打印出只有2位以上的数字设置为1的数字。我该怎么做才能有效?我做了一个程序版本,我用mmap读取文件中的数字,而且速度非常快。我读它就像一个非常大的* char缓冲区并使用strtol我'擦掉'每个数字并做我的检查和诸如此类的东西。
有没有办法以相同的方式操作通过stdin传递的字符串?我虽然使用fread缓冲,但是有一个问题,缓冲区切断了数字(意思是如果我通过“1024 35”而我有一个6字节的缓冲区,我会得到“1024 3”),我不禁思考如何解决这个问题。
来源:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> /* mmap() is defined in this header */
#include <fcntl.h>
#include<string.h>
#include"apue.h"
int main (int argc, char *argv[])
{
int fdin, fdout;
char *src, *dst;
struct stat statbuf;
/* open the input file */
if ((fdin = open (argv[1], O_RDONLY)) < 0)
{printf("can't open %s for reading", argv[1]);return 1;}
/* find size of input file */
if (fstat (fdin,&statbuf) < 0)
{printf("fstat error");return 1;}
/* mmap the input file */
if ((src = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0))
== (caddr_t) -1)
{printf("mmap error for input");return 1;}
char* beg=src;
long x;
char* end=&src[statbuf.st_size-1];
while(src<end)
{
beg=src;
x = strtol (src,&src,10);
if(!((x != 0) && ((x & (~x + 1)) == x)))
fwrite(beg, 1, (int)(src-beg), stdout);
}
return 0;
}
答案 0 :(得分:1)
我认为预期的解决方案是如何计算那些而不是如何从stdin读取。
int count_ones(int n);
意味着问题是如何有效地实现count_ones。 你的主要应该是这样的:
int main()
{
int x;
cin>>x;
if( count_ones(x)>2){
cout<<x<<endl;
}
return 0;
}
我认为预期的答案是:
使用数组大小256
为每个字节(= unsigned char)放入数组中的数量为1(可以是:从0到8)
将每个数字拆分为其字节,并对每个字节的数字求和。
返回结果