首页 > 代码库 > 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 !