天王盖地虎
1,求有序数列中某个元素的个数
思想:二分找上下界:
int element_count(int * set, int len, int e) { int f, a, b, t; for(a = 0, b = len - 1; a < b; set[t = a + b >> 1] < e ? (a = t + 1) : (b = t - 1)); for(f = a, b = len - 1; a < b; set[t = a + b >> 1] <= e ? (a = t + 1) : (b = t - 1)); return b - f; }
另一种实现:
int element_count(int * set, int len, int e) { int t; if(set[0] == e && set[len - 1] == e) return len; if(set[0] > e || set[len - 1] < e) return 0; t = len / 2; return element_count(set, t, e) + element_count(set + t, len - t, e); }
其他方法:
int element_count(int * set, int len, int e) { int min=0,max=len-1,mid,count=0,k; while(min < max) { mid=(min+max)/2; if(set[mid]==e) { count = 1; for(k = mid ; k >= 0 && set[k]==e ; k --); count += (mid-k-1); for(k = mid ; k < len && set[k]==e ; k ++); count += (k-mid-1); break; } else if(set[mid]>e) max=mid-1; else min = mid+1; } return count; }
2,素数:
#include<stdio.h> #include<math.h> int s(int k) { int i; int flag = 1; for(i=2;i< sqrt(k) && flag; i++) { if(0 == k%i) flag = 0; } if(flag) return 1; return 0; } void main() { int i,n; printf("please input a number here:\n"); scanf("%d",&n); if(n >=2) printf("%d\n",2); for(i=3;i<=n; i+=2) { if(s(i)) printf("%d\n",i); } }
判断函数也可以这样写:
int s(int k) { int i; for(i=2; i<= sqrt(k) && k%i; i++); if(i > sqrt(k)) return 1; return 0; }
还可以写成:
int s(int k) { int i; if(k < 2) return 0; if(k == 2) return 1; for(i = 3; i*i < k; i+=2) if(k%i == 0) return 0; return 1; }
还可以这样:
int s(int k) { int i; if(k < 2) return 0; if(k == 2) return 1; for(i = 3; i*i<k && k%i; i+=2); if(i*i >= k) return 1; return 0; }
3,删除一个字符串中存在另一个字符串中的字符:
#include <stdio.h> #include <string.h> squeeze(char* s1, const char* s2) { int i = 0,j = 0,k = 0; int flag = 0; char tm[100] = {0}; int len1 = strlen(s1); int len2 = strlen(s2); for(i=0; i<len1; i++) { flag = 1; for(j=0; j<len2 && flag; j++) { if(s1[i]==s2[j]) { flag = 0; } } if(flag) tm[k ++] = s1[i]; } strcpy(s1,tm); } int main() { char a[100] = {0},b[100] = {0}; printf("请输入s1:"); scanf("%s",a); printf("请输入s2:"); scanf("%s",b); squeeze(a,b); printf("删除后:%s\n",a); return 0; }
一次循环实现:
squeeze(char* s1, const char* s2) { int i = 0,k = 0; int flag = 1; int len1 = strlen(s1); int len2 = strlen(s2); char tm[100] = {0}; char sample[128] = {0}; for(i = 0 ;i < len2 ; i ++) sample[s2[i]] = 1; for(i = 0 ;i < len1 ;i ++) { flag = 1; if(sample[s1[i]]) flag = 0; if(flag) tm[k ++] = s1[i]; } tm[k] = 0; strcpy(s1,tm); }
4,字符转换:
#include<stdio.h> #include<string.h> void main() { char c[20]; int i=0,len; printf("请输入字符串C:"); scanf("%s",c); len = strlen(c); for(;i<len&&(c[i]|=32);i++); puts(c); }
或者:
#include<stdio.h> #include<string.h> void main() { char c[20]; int i=0; printf("请输入字符串C:"); scanf("%s",c); for(;c[i]&&(c[i]|=32);i++); puts(c); }
5,小问题
#include <stdio.h> #include "string.h" int main() { char *str=NULL; int *p=NULL; // int a; // printf("%p ",&a); 测试当前程序变量可用的地址 str=(char*)0xFA65; printf("%p ", str); // p=(int*)str; p=(int*)0x0012FF3C; printf("%p ", p); memcpy(p, "123", 3); // *p = 12; printf("%d\n", *p); return 0; }
6,数字根是指对一个整数,把它的各位数字相加,若其和为一位数,则此和即为其根,若不是一位数字,则把它的各位数字继续相加,直到其和为一个正整数为止。例如对于正整数24,因为2+4=6,和为1位数,所以6即为其根。对于39,因为3+9=12,和不为个位数,继续相加,1+2=3,3为个位数,则为数字的根。要求输入若干个正整数,以0为结束,输出每个正整数的根。
unsigned foo( unsigned n ) { while( n > 9 ) n = n%10 + n/10; return n; }
7,
有一种落差是,你配不上自己的野心,也辜负了所受的苦难