首页 > 代码库 > The beginning !

The beginning !

 

今天算是我的开始吧,正式加入C语言、C++ 编程这个长跑的队伍。加入这个行列的原因也很简单,每次通过短小的程序解决一个问题时,那感觉还是自豪感爆棚啊!小小代码,有时很短,包含的逻辑思维却很丰富,很巧妙! 

分享一下昨天总结的一些代码和经验:

原题1:见图片

我的程序(正解):

/*    草滩小王子的相反数    BY IT_greenhand    2014/11/30*/ #include<stdio.h>#include<string.h>#include<stdbool.h>#define N 1000000000long int n,no,i,len;bool a[N];int main(){    int m;    i=0;        memset(a,false,sizeof(a));        while(scanf("%ld",&n)!=EOF)    {        no=0;i=0;  //注意清零         while(n!=0)        {            m = n%2;            n = n/2;            if(m) a[i]=true;            else a[i]=false;            i++;        }        len = i;        i=0;            while(!a[i]) i++;        for(;i<len;i++)        {            //if(a[i]) printf("1");            //else printf("0");                            if(a[i]) no = no*2+1;            else     no = no*2;                    }        printf("%d\n",no);                }    return 0;}

这个题里面涉及儿二进制的思想,感觉还是比较陌生,算是长见识了!
思路是:首先将输入的十进制数转化为二进制(true/false)反序放在数组里面,然后正序转化为十进制,最后就得到了符合要求的相反数。

 

原题2(见图片):

我的代码:

 #include<stdio.h>#include<math.h>int main(){    unsigned long int a;    int cnt,i,k;    while(scanf("%ld",&a)!=EOF)    {        if(a!=1)        {                cnt=0;        k = sqrt(a);        for(i=1;i<sqrt(a);i++)        {            if(a%i==0)                cnt+=2;        }        if(k*k == a) cnt++;        printf("%d\n",cnt);       }         else       printf("1\n");            }    return 0;}

总结:

1、对于数据2^31测试不通过,long int 的数据范围(-2^31,2^31-1),在此贴一下数据范围的总结

unsigned   int   0~4294967295  

int   -2147483648~2147483647

unsigned long 0~4294967295

long   2147483648~2147483647

long long的最大值:9223372036854775807

long long的最小值:-9223372036854775808

unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807

__int64的最小值:-9223372036854775808

unsigned __int64的最大值:18446744073709551615

正数最大为unsigned __int64,取到2^64-1,超过就要用高精度算法了。

2、找公约数只找到sqrt(a)可以减小时间复杂度,是个优化,且在这里不能带等号。

 

The beginning !