程序设计能力实训2数制专题

这个专题真的写的我生无可恋,每每在暴走和睡着的边缘徘徊
I’m dying

接week1的一点小提示:关于数学问题

之前有写到一道题是需要让平面直角坐标转化为极坐标
在c++的cmath库当中:
atan2取到的是-pi到pi,但是题目要求取到的是0-2pi
为了简化算法,我们可以采用取模的好办法:

fmod(atan2(y,x), 2 * M_PI)

另外需要注意的是控制输出小数位数的办法:

cout << fixed << setprecision(4) << "(" << poi[j].len << "," << poi[j].ang << ")" << endl;

初始化数组的办法

1.循环遍历
2.memset(a,0,sizeof(a))(亲测对二维数组十分有效)
注意:在c++中记得一定要调用ctsring库
(或者使用结构体能够节约很多时间)

关于题目的变态要求:要求你输出的每一行结尾没有空格

为了通过我们的样例:最好的办法是先输出每一行第一个输出,然后再循环<< ’ ’ << XX ;亲测有效

2893 关于位数

1.此题目涉及到对于中文的处理:
不管是用string还是用char数组处理的中文,中文占两个字节,在内部编译为乱码,甚至可能出现为补码的表现(无法计算位数了)
所以要强转一下:unsigned char a = str[i]
char类型储存的话则会截断(因为char类型只有一个字节)

2.对于数的处理:
在这里插入图片描述
按位与运算:按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只要对应的二个二进位都为1时,结果位就为1。参与运算的两个数均以补码出现。 例如:3&10可写算式如下: 00000011&00001010 00000010 十进制2
<<左移运算符>>右移运算符
字符通过与1‘&’(结果只会是1或者0),然后再用左移/右移运算符移位,可以借此计算这个数1或者0的个数
或者

for(i = 0; i < len; ++i)
        {
          int x = 1;
          for(j = 0; j < 8; ++j)
          {
            if(s[i] & x) cnt++;
            x = x << 1;
          }
        }

gcd的简化算法

int gcd(int a, int b)
{
    return(b==0)?a:gcd(b,a%b);
}

3053神秘信息

1.计算非重复字符的个数,个数代表几进制,每一个非重复字符代表了此进制下的一个数,从而转换为数值
2.要注意:因为这道题,数据很大所以用了long long型输出,但是使用c++中自带的cmath库会遇上精度问题(我自己的解决办法是自己写了一pow解决,讨论区有人说pow+0.5能解决问题,我试过没有成功,可能和我的算法有关?)

long long pow(long long a, long long b)
{
    long long temp = a;
    if(b == 0) return 1;
    for(int i = 1; i < b; i++)
        a *= temp;
    return a;
}

注意⚠️:要用一个temp来储存a,否则a的值会一直改变
优化以后的算法:

long long num = 0, a = 0;
    long long cha[NUM + 1];
    memset(cha, -1, sizeof(cha));
    cha[str[a]] = 1;
    while(str[++a])
        if(cha[str[a]] == -1)
        {
            cha[str[a]] = num;
            num = num ? num + 1 : 2;
        }
    if (num < 2) num = 2; a = 0;
    while(str[a]) cnt = (cnt * num + cha[str[a++]]);

大整数的进制转换(吐血)

照着模板抄吧,我也没办法,智商不太够理解不了

string str;
int num = 0,bin[NUM], m, n;//m待转换进制,n为转换后进制
for(int i = 0; i < str.length();)
{
int k = 0;
forint j = i; j < str.length();j++{
int temp = (str[j] - '0' + k * m) % 2;
str[j] = (str[j] - '0' + k * m) / 2 + '0';
k = temp;
}
bin[num++] = k;
while(str[i] == '0') i++;
}

2822

这也没办法,模版上吧:
atoi和atof只对字符数组有用,string类型不可以
所以又需要调用strchr来比较寻找"."(还只能用双引号)
要输出%02x的类型仍然是printf比较适合
非常C的风格

进制转换

while(x)
        {
            op_rev[cnt++] = x % y;
            x /= y;
        }

还是while(x)比较好,while(x%y)容易在x和y相等的时候自己暴死
在这里插入图片描述
#3040
memset 不能把数组初始化为0或者-1之外的值!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值