c/c++语言开发共享算法竞赛中c++一些需要注意的错误

1. 关于精度: 取整 除法取整: (除数为正)被除数为正时系统除法为向下取整,被除数为负时系统除法为向上取整。 向上取整(被除数非负,除数为正): 一般写法(有bug): 上述写法只适用于x为正的情况,x为0时有错误。 正确写法: 或 库函数(cmath库) : (返回值为double) 向上取整 …


1. 关于精度:

取整

  • 除法取整:
    • (除数为正)被除数为正时系统除法为向下取整,被除数为负时系统除法为向上取整。
    • 向上取整(被除数非负,除数为正):
      一般写法(有bug):
    int cal(int x,int y) {   return (x-1)/y+1; }

    上述写法只适用于x为正的情况,x为0时有错误。
    正确写法:

    int cal(int x,int y) {   return x/y+(x%y!=0); }

    int cal(int x,int y) {   return (x+y-1)/y; }
  • 库函数(cmath库)

    (返回值为double)
    向上取整:ceil(x);
    向下取整:floor(x);
  • 四舍五入:
ll cal(double x) {     return (x>=0.0)?(ll)(x+0.5):(ll)(x-0.5); }
  • 除数为正通用:
    • 向上取整:
    int cal(int x,int y) {   return (x>=0)?(x+y-1)/y:x/y; }
    • 向下取整:
     int cal(int x,int y)  {    return (x>=0)?x/y:(x-(y-1))/y;  }

    赋值

  • 科学计数法:
ll inf=1e18+7;

上述写法有错,因为科学计数法为double型,由于精度问题,inf实际被赋值为1e18.
正确写法:

ll inf=1000000000000000007ll;
  • double:
 double x=0.0;   x=-x;   cout<<x;

控制台输出为:(-0)

溢出

  • 位运算左移:
cout<<(1<<31);

控制台输出:(-2147483648)
正确写法:

 cout<<(1ll<<31);

注意,以下写法还是会溢出:

cout<<(1<<31ll);
  • 循环:
    因为int型变量溢出,以下循环无法退出:
for(int i=0;i<=2147483647;i++)if(i<0)cout<<"overflow";

2. 关于字符串:

读入:

  int x=1;   char s[1];   scanf("%s",&s);   cout<<x;

输入:a
控制台输出:0
这是因为读入a之后还读入了一个换行符,覆盖了x的内存。所以,字符数组最好不压边界开(除非用getchar)。

3. 关于编译器:

报错:

  • id returned 1:
    • 一种情况是该源文件其可执行文件正在运行
    • 另一种情况是主函数名拼错了:
    int mian() {  return 0; }

    运行:

    int main() { //  cout<<"hello world"; return 0; }

    控制台无输出。
    在注释后“”这样写会跳过该行的下一行语句

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606421.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐