面试算法题

题目和实现方法

//1.判断一个数是否是质数 如果是质数,函数的返回值为1, 否则为0
int isPrimeNumber(int num){
    
    if(num == 1) return 0;
    
    if(num == 2) return 1;
    
    for (int i=2; i < num; i++) {
        if (num % i == 0) {
            return 0;
        }
    }
    
    return 1;
}

//2. 编写一个函数,输入两个正整数, 输出最大公约数 和 最小公倍数
// GCD Greatest Common Divisor   LCM Lowest Common Multiple
void printGCDAndLCM(int a, int b) {
    
    //最大公约数

    int min = a < b ? a : b;
    
    int gcd = 1;
    
    for (int i = 1; i < min; i ++) {
        
        if (a % i == 0 && b % i == 0) {
        
            gcd = i;
        }
        
    }
    printf("\n(%d,%d)最大公约数gcd:%d\n",a,b,gcd);
    
    //最小公倍数
    
    int max = a > b ? a : b;
    
    int lcm = 1;
    
    for(int i=1 ; i <= max ; i++){
        
        if ((i * min) % max == 0) {
            lcm = i * min;
            break;
        }
        
    }
    printf("(%d,%d)最小公倍数lcm:%d\n",a,b,lcm);
    
    
    
}


//3.一张一元纸币兑换成一分,二分和五分的硬币,假定每种至少一枚,编程序计算共有多少种兑换方法并打印各种兑换方法.

void calcuExchange(){
    
    // 100 = 1 + 2 + 5 + ?
    //int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
    int money[3] = {1,2,5};
    
    int exchangeMoney = 100 - 1 - 2 - 5;
    
    int no1 = exchangeMoney / money[0];
    
    int no2 = exchangeMoney / money[1];
    
    int no5 = exchangeMoney / money[2];
    
    for (int i = 0; i <= no1; i ++)
        for(int j = 0 ;j <= no2; j++)
            for(int k = 0; k<= no5;k++){
                
                if (exchangeMoney  ==  (i * money[0] + j * money[1] + k * money[2])) {
                    
                    printf("100 = %d * %d + %d * %d + %d * %d\n",money[0],i+1,money[1],j+1,money[2],k+1);
                }
                
            }
    
    
}


//4.编写一个函数,在屏幕上打印金字塔

void printPyramid(int line){
    
    for (int i = 0; i < line; i++) {
        
        //打印空格
        for (int j=0; j < line - i - 1; j++) {
            printf(" ");
        }
        //打印#
        for (int k=0; k < 2*i+1; k++) {
            printf("#");
        }
        //换行
        printf("\n");
    }
    
}

//5 一个正整数有可能可以被表示为n(n>2)个连续正整数之和, 如
/*
15 = 1 + 2 + 3 + 4 + 5
15 = 4 + 5 + 6
15 = 7 + 8
 编写程序,根据输入的正整数,输出符合这种要求的所有连续正整数序列.
*/

void printPositiveSequence(int num){
    
    int flag = 0;
    
    for (int i = 1; i <= num/2 ; i++) {
        
        int tmp = 0;
                             //最大要尝试到num/2 + 1
        for (int j = i; j <= num/2 + 1; j++) {
            
            tmp = tmp + j;
            
            if (tmp > num) {// 大于跳出内层循环
                break;
                
            }else if (tmp == num){//找到了
                
                flag =1;
                
                printf("%d = ",num);//前端
                
                for (int k = i; k <= j ; k++) {
                    
                    if (k == i) { //第一部分
                        printf("%d",k);
                    }else{
                        //后面
                        printf(" + %d",k);
                    }

                }
                printf("\n");

            }
            
        }
        
    }
    
    if (flag == 0) {
        printf("%d : none\n" ,num);
    }
    
}

//6.将一个正整数分解质因数, 例如 输入 90 打印出 90 = 2 * 3 * 3 * 5
//me
void decomposePrimFactor(int num){
    
    int tmp = num;
    int flag = 0;
    for (int i = 2; i <= num/2; i++ ) {
        if (isPrimeNumber(i)) {
            while (tmp % i == 0) {
                if (flag ==0) {
                    printf("\n%d = %d ",num,i);
                    flag = 1;
                }else{
                    printf("* %d ",i);
                }
                
                tmp = tmp / i;
    
            }
        }
    }
    
    if (flag == 0) {
        printf("%d 不能分解质因数",num);
    }
}

//更好的答案
void decomposePrimFactor2(int n){
    
    int i;
    
    printf("%d=",n);
    
    //从2开始到n
    for(i=2;i<=n;i++)
    {
        //找到可以除的数
        while(n%i==0)
        {
            printf("%d",i);
            n/=i;
            if(n!=1) printf("*");
        }
    }

    
}

//7. 打印出杨慧三角形(要求打印出10行如下图)
void printTriangle(int num){
    
    int a[num][num];
    
    for (int i = 0; i < num; i++) {
        
        //打印空格
        for (int j = 0 ; j < num - i; j++) {
            printf("  ");
        }
        //打印每行数字
        for (int k = 0; k <= i; k++) {
            if (k == 0 || k == i ) {
                a[i][k] = 1;
            }else{
                a[i][k] = a[i-1][k] + a[i-1][k-1];
            }
            printf("  %3d",a[i][k]);
        }
        
        printf("\n");
        
    }
    
}

//8. 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位;
void theLastOneNo(int num){
    
    //二维数组
    int  n[2][num];
    
    //留下的人数
    int m = num;
    
    //二维数字, 第一行标示这个是否出局,0表示还在,1出局. 第二行表示人的编号
    for (int i = 1; i <= num; i++) {
        n[0][i-1] = 0;
        n[1][i-1] = i;
    }
    
    //j表示实际指向的人的编号, k表示报的的数(1到3),
    int j = 0, k = 0;
    
    //留下的人数大于
    while (m > 1) {

        j = j + 1;
        //j超过最大人数回到初始位置
        if (j > num) {
            j = 1;
        }
        
        //指向的人没出局,增加有效报数
        if (n[0][j-1] == 0) {
            k++;
        }
        
        //当到达有效报数,标记当前位置的人出局,减少留下来的人,重置报数
        if (k == 3) {
            n[0][j - 1] = 1;
            m--;
            k = 0; //重置`
        }

    }
    
    //打印留下来的人
    for (int i = 0; i < num; i++) {
        if (n[0][i] == 0) {
            printf("\n-%d个人游戏,最后一个人是:%d号",num,n[1][i]);
        }
    }

}


- (void)theLastOneNo:(NSInteger)num{
    
    NSMutableArray *array =  [NSMutableArray arrayWithCapacity:num];
    
    for (int i = 0; i < num; i++) {
        array[i] = @(i+1);
    }

    int n = 1, m = 0;
    
    do {
        
        if (n % 3 == 0 ) {
            
            [array removeObjectAtIndex:m];
            m--;
        }
        
        n++;
        m++;
        m = m == array.count ? 0 : m;
        
        
    } while (array.count>1);
    
    NSLog(@"\n%ld个人游戏,最后一个人是:%@号",(long)num,array.lastObject);
    
}


//9.乒乓球比赛
void printGamelist(){
    
    char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/
    for (i='x';i<='z';i++)
        for (j='x';j<='z';j++)
            if (i!=j)
                for (k='x';k<='z';k++)
                    if (i!=k && j!=k)
                        if (i!='x' && k!='x' && k!='z')
                            printf("A--%c , B--%c ,C--%c\n",i,j,k);
   
}

测试

    //1
    for (int  i = 1; i < 100; i++) {
        
        if (isPrimeNumber(i) == 1) {
            
            printf("%d ",i);
        }
        
    }
    
    //2
    printGCDAndLCM(10, 15)  ;
    
    
    //3
    calcuExchange();
    
    
    //4
    printPyramid(8);
    
    
    //5
    printPositiveSequence(15);

    
    //6
    decomposePrimFactor(90);
    decomposePrimFactor2(11);
    
    
    //7
    printTriangle(10);
    
    
    for (int i = 1; i < 10; i ++) {
        //8
        //[self theLastOneNo:i];
        theLastOneNo(i);
    }
    
    
    //9
    printGamelist();

结果

image.png
image.png
面试算法题_第1张图片
image.png
                                                              ...
面试算法题_第2张图片
image.png
面试算法题_第3张图片
image.png
image.png
image.png
面试算法题_第4张图片
image.png
面试算法题_第5张图片
image.png
image.png

你可能感兴趣的:(面试算法题)