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,