面试算法题

题目和实现方法

//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
image.png
                                                              ...
image.png
image.png
image.png
image.png
image.png
image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容