天王盖地虎

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+,和为1位数,所以6即为其根。对于39,因为3+12,和不为个位数,继续相加,,3为个位数,则为数字的根。要求输入若干个正整数,以0为结束,输出每个正整数的根。

unsigned foo( unsigned n )
{
    while( n > 9 )
        n = n%10 + n/10;
    return n;
}

 

7,

posted @ 2013-08-08 15:24  lfsblack  阅读(307)  评论(0编辑  收藏  举报