C语言中的零碎知识点

——————————————————-————————嘻嘻嘻 其实这也不是我自己总结的 是学长总结的-——————————————————-————————————

tips

1.数据类型取值范围

unsigned int 0~42 9496 7295 

int -2147483648~21 4748 3647 

unsigned long 0~4294967295

long -2147483648~2147483647

long long的最大值:922 3372 0368 5477 5807

long long的最小值:-9223372036854775808

unsigned long long的最大值:184 4674 4073 7095 5161

__int64的最大值:922 3372 0368 5477 5807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:1844 6744 0737 0955 1615

 

4.最精巧的无穷大常量取值是0x3f3f3f3f.

 

5.一维数组初始化为0可以这样写Int a[8]={0};

二维数组初始化为0可以这样写Int a[8][8]={{0}};  两个大括号即可

 

6.在判断两个浮点数大小时,一定要在一边先减去0.000001,如a<b,一定写成a-0.000001<b才行!

 

7.如何输出float型而后面不加0?

printf("%g", num);

 %g用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的0。即%g是根据结果自动选择科学记数法还是一般的小数记数法

 

7.scanf("\n%*c%d",&m);

Scanf 格式中,如果在%后面、格式字符前面加上一个“*”附加说明符,表示跳过该输入,输入的数据不放入变量中。

而输入的 '\n' 是中和掉输出的 \n

也可以换成

getchar();

scanf("%*c%d",&m);

而 *c 表示忽略一位 也可以改成

scanf("%*1d%d",&m);

 

8.分离整数和小数部分

要求:编写一个程序,其功能为:从键盘上输入一个浮点数(小数点后有三位数),然后分别输出该数的整数部分和小数部分。

样例输入:123.456

样例输出:123 456

#include <stdio.h> 

int main() 

    float x; 

    int a, b; 

   scanf("%f",&x); 

    a=x;  //自动类型转换,取整数部分 

    b=(int)(x*1000)%1000;  //乘1000后对1000取余,得到3位小数点后数字 

    printf("%d %d\n", a,b); 

    return 0; 

 

9.素数判定函数

int Prime_judge(int x)

{

       int i;

       if(x==0||x==1)   return 0;

       for(i=2;i<=sqrt(x);i++)

       if(x%i==0)   return 0;//不是素数

       else         return 1;//是素数

}

 

10.itoa  

将任意类型的数字转换为字符串。在<stdlib.h>中与之有相反功能的函数是atoi。

非标准C语言扩展函数

char*itoa(int value,char*string,int radix);

int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等

 

11.求最小公倍数和最大公约数

最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数

求最小公倍数算法:最小公倍数=两整数的乘积÷最大公约数

求最大公约数算法:

(1辗转相除法

#include<stdio.h>

void main()   /*  辗转相除法求最大公约数 */

{

   int m, n, a, b, t, c;

   printf("Input two integernumbers:\n");

   scanf("%d%d", &a, &b);

   m=a;   n=b;

   while(b!=0)  /* 余数不为0,继续相除,直到余数为0 */

   { c=a%b; a=b;  b=c;}

   printf("The greates commondivisor:%d\n", a);//最大公约数 GCD

   printf("The least commonmultiple:%d\n", m*n/a);}//最小公倍数 LCM

 

12.自然常数e的x次方,表示方法为:exp(x)。

 

13.试求定积分的近似值(积分限a,b从键盘输入)。

算法分析如下:

    求定积分的近似值常有矩形法与梯形法,其实质都是面积求和。

    矩形法是把所要求的面积垂直x轴分成n个小矩形,然后把这n个小矩形的面积相加,即为所求的定积分的值。

    梯形法是把所要求的面积垂直分成n个小梯形,然后作面积求和。

    这两种近似求值的精度随分割个数n的增加而增加,对于相同的n个数,相对来说,梯形法的精度比矩形法的要高一些。

程序代码如下:

例一:

void main()

{

    int i,n=1000;

    float a,b,h,t1,t2,s1,s2,x;

    printf("请输入积分限a,b:");

   scanf("%f,%f",&a,&b);

    h=(b-a)/n;

    for(s1=0,s2=0,i=1;i<=n;i++)

    {

        x=a+(i-1)*h;

       t1=(float)exp(-x*x/2);t2(float)=exp(-(x+h)*(x+h)/2);

        s1=s1+t1*h;        /*矩形面积累加*/

        s2=s2+(t1+t2)*h/2;        /*梯形面积累加*/

    }

    printf("矩形法算得积分值:%f.\n",s1);

    printf("梯形法算得积分值:%f.\n",s2);

}

程序运行结果如下:

    矩形法算得积分值:0.855821

    梯形法算得积分值:0.855624

    由上面的比较可知,梯形法的精度要高于矩形法。

例二 求函数f(x)=x*x+2*x+1在【0,2】上的定积分。

    #include

    main()

       {    double s=0,h,a,b,f0,f1,n;

             int i;

             printf("Entern,a,b:");

            scanf("%lf,%lf,%lf",&n,&a,&b);

             h=(b-a)/n;

             f0=a*a+2*a+1;

             for(i=1;i<=n;i++)

                 {  a=a+h;

                     f1=a*a+2*a+1;

                    s+=(f0+f1)*h/2;

                     f0=f1;

                 }

            printf("sum is%f",s);

        }

 

14.二分查找又称折半查找

void g(int k,int m)//在长度为m的数组num找到元素k.

{

       int high=m-1,flag=0;//flag做标记

       int low=0,mid;

       while(low<=high){

              mid=(low+high)/2;

              if(num[mid]<k)

              low=mid+1;

              else if(num[mid]>k)

              high=mid-1;

              else{

                     flag=1;

                     printf("YES\n");

                     break;

              }

}

if(flag==0)   

printf("NO\n");

}

 

15.输出a和b的比值。如果需要,输出一个既约分数。

分子、分母只有公因数1的分数,或者说分子和分母互质的分数,叫做最简分数,又称既约分数。如:二分之一,三分之二,九分之八,八分之三等等。

int gcd(int a,int b)//求最大公约数

{

         while(b!=0)

         {

                   int r=a%b;

                   a=b;

                   b=r;

         }

         return a;

}

if(aa%bb==0)

printf("%d\n",aa/bb);

else

printf("%d/%d\n",aa/gcd(aa,bb),bb/gcd(aa,bb));

16.double型强转int型

应该使用向下取整;+0.5实现四舍五入。

例如:double a=;intb=(int)(a+0.5);

 

17.任意进制转换

语法:conversion(char s1[],chars2[],long d1,long d2);

参数:

s[]:原进制数字,用字符串表示

s2[]:转换结果,用字符串表示

d1:原进制数

d2:需要转换到的进制数

返回值: null

注意: 

  高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证

源程序: 

  void conversion(char s[],char s2[],longd1,long d2)

{

    long i,j,t,num;

    char c;

    num=0;

    for (i=0;s[i]!='\0';i++)

        {

        if (s[i]<='9'&&s[i]>='0')t=s[i]-'0'; else t=s[i]-'A'+10;

        num=num*d1+t;

        }

    i=0;

    while(1)

        {

        t=num%d2;

        if (t<=9) s2[i]=t+'0'; elses2[i]=t+'A'-10;

        num/=d2;

        if (num==0) break;

        i++;

        }

    for (j=0;j<i/2;j++)

        {c=s2[j];s2[j]=s[i-j];s2[i-j]=c;}

    s2[i+1]='\0';

}

 

18.求排列组合数

语法:result=P(long n,long m); /result=long C(long n,long m);

参数:

m:排列组合的上系数

n:排列组合的下系数

返回值: 排列组合数

注意: 

  符合数学规则:m<=n

源程序: 

  long P(long n,long m)

{

    long p=1;

    while(m!=0)

       {p*=n;n--;m--;}

    return p;

}

long C(long n,long m)

{

    long i,c=1;

    i=m;

    while(i!=0)

        {c*=n;n--;i--;}

    while(m!=0)

        {c/=m;m--;}

    return c;

}

 

19.x的二进制长度

语法:result=BitLength(int x);

参数:

x:测长的x

返回值: x的二进制长度

源程序: 

  int BitLength(int x)

{

    int d = 0;

    while (x > 0) {

        x >>= 1;

        d++;

    }

    return d;

}

 

20.返回x的二进制表示中从低到高的第i位

语法:result=BitAt(int x, inti);

参数:

x:十进制 x

i:要求二进制的第i位

返回值: 返回x的二进制表示中从低到高的第i位

注意: 

  最低位为第一位

源程序: 

  int BitAt(int x, int i)

{

    return ( x & (1 << (i-1)) );

}

ps:仅供参考 如果有不对的 欢迎大神们指出来~么么哒!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值