简单编程题汇总

1. 求最大公约数

#include <stdio.h>

int main() {
    int a = 0;
    int b = 0;
    int c = 0;
    scanf("%d %d", &a, &b);

    //辗转相除法
    while (c = a % b) {
        a = b;
        b = c;
    }

    printf("%d\n", b);

    return 0;
}

2. 字符串逆序(递归实现)

方法 1:

#include <stdio.h>
#include <string.h>

void reverse(char* str) {
    int len = strlen(str);
    if (len <= 1) {
        return;
    }
    char tmp = *str;//1
    *str = *(str + len - 1);//2
    *(str + len - 1) = '\0';//3
    reverse(str + 1);//4
    *(str + len - 1) = tmp;//5
}

int main() {
    char arr[] = "abcdef";
    reverse(arr);
    
    printf("%s", arr);
    
    return 0;
}

方法 2:

#include <stdio.h>
#include <string.h>

void reverse(char* str, int left, int right) {
    if (right  <= left)
        return;
  
    char tmp = str[left];
    str[left] = str[right];
    str[right] = tmp;
    reverse(str, left + 1, right - 1);
}

int main() {
    char arr[] = "abcdef";
    reverse(arr, 0, strlen(arr) - 1);
    
    printf("%s", arr);
    
    return 0;
}

3. n 的 k 次方(递归实现)

#include <stdio.h>

double Pow(int n, int k) {
    if (k == 0)
        return 1;
    else if (k > 0) {
        return n * Pow(n, k - 1);
    } 
    else if (k < 0) {
        return 1 / Pow(n, -k);
    }
}

int main() {
    int n = 0, k = 0;
    scanf("%d %d", &n, &k);
    
    double ret = Pow(n, k);

    printf("%lf\n", ret);
    
    return 0;
}

4. 小乐乐走台阶(BC117)

小乐乐上课需要走 n 阶台阶,每次可以选择走 1 阶或者走 2 阶,一共有多少种走法?

#include <stdio.h>

int fib(int n) {
    if (n <= 2)
        return n;
    return fib(n - 1) + fib(n - 2);
}

int main() {
    int n = 0;
    scanf("%d", &n);
    int ret = fib(n);

    printf("%d\n", ret);
    
    return 0;
}

 5. 序列中删除指定数字(BC98)

#include <stdio.h>

int main() {
	int n = 0;
	scanf("%d", &n);
	int arr[n];
	int i = 0;
	for (i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	int del = 0;
	scanf("%d", &del);

	int j = 0;
	for (i = 0; i < n; i++) {
		if (arr[i] != del) {
			arr[j++] = arr[i];
		}
	}

	for (i = 0; i < j; i++)
		printf("%d", arr[i]);

	return 0;
}

6. 字母大小写转换(BC48)

#include <stdio.h>

int main() {
	char ch = 0;

	while (scanf("%c", &ch) == 1) {
		if (ch >= 'a' && ch <= 'z')
			printf("%c", ch - 32);
		else
			printf("%c", ch + 32);

		getchar();//过滤'\n'
	}

	return 0;
}

scanf() 函数

在读取成功的时候,返回的是读取的数据的个数;

在读取失败的时候,返回 EOF。

调用库函数写法:

#include <stdio.h>
#include <ctype.h>

int main() {
	char ch = 0;

	while (scanf(" %c", &ch) == 1) {
		if (islower(ch))
			printf("%c", toupper(ch));
		else if (isupper(ch))
			printf("%c", tolower(ch));
	}

	return 0;
}

%c 的前面加空格:跳过下一个字符之前的所有空白字符。

7. 变种水仙花(BC38)

#include <stdio.h>
#include <math.h>

int main() {
	int i = 0;
	for (i = 10000; i <= 99999; i++) {
		int j = 0;
		int sum = 0;
		for (j = 1; j <= 4; j++) {
			int k = (int)pow(10, j);
			sum += (i / k) * (i % k);
		}
		if (sum == i) {
			printf("%d ", i);
		}
	}

	return 0;
}

8. 写一个函数返回参数的二进制中 1 的个数

方法 1:

#include <stdio.h>

int count_num_of_1(unsigned int n) {
	int count = 0;
	while (n) {
		if (n % 2 == 1) {
			count++;
		}
		n /= 2;
	}
	return count;
}

int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = count_num_of_1(n);

	printf("%d", ret);

	return 0;
}

 注意:该函数在传递 负数 参数时要将其转换为 无符号数 再进行运算,因此函数定义时的形参为 无符号整型。

类比于十进制数(如:1234)通过 %10 和 /10 来遍历十进制数的每一位。

二进制数(如:1011)也可以通过 %2 和 /2 来遍历二进制数的每一位。

方法 2:

#include <stdio.h>

int count_num_of_1(int n) {
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++) {
		if ((n >> i) & 1 == 1) {
			count++;
		}
	}
	return count;
}

int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = count_num_of_1(n);

	printf("%d", ret);

	return 0;
}

方法 3:

#include <stdio.h>

int count_num_of_1(int n) {
	int count = 0;
	while (n) {
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = count_num_of_1(n);

	printf("%d", ret);

	return 0;
}

采用 借位 的思想。

应用:判断一个数是不是 2 的 n 次方。

9. X型图案(BC68)

#include <stdio.h>

int main() {
	int n = 0;
	scanf("%d", &n);
	int i = 0, j = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			if (i == j) {
				printf("*");
			}
			else if (i + j == n - 1) {
				printf("*");
			}
			else {
				printf(" ");
			}
		}
		printf("\n");
	}

	return 0;
}

10. 获得月份天数

#include <stdio.h>

int is_leap_year(int y) {
	return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0);
}

int main() {
	int y = 0;
	int m = 0;
	int d = 0;
	int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	
	while (scanf("%d%d", &y, &m) == 2) {
		d = days[m];
		if (is_leap_year(y) && m == 2) {
			d++;
		}
		printf("%d", d);
	}

	return 0;
}

scanf() 函数返回 接收元素 的个数。

11. 求最大公约数与最小公倍数 (BC115)

#include <stdio.h>

int main() {
	long n = 0;
	long m = 0;

	while (scanf("%d %d", &n, &m) == 2) {
		long i = n;
		long j = m;
		long r = 0;
		while (r = i % j) {
			i = j;
			j = r;
		}

		printf("%ld\n", j + m * n / j);
	}
	
	return 0;
}

m * n / j 就是最小公倍数。 

注意 数据的取值范围问题。

 12. 空心正方形图案(BC69)

#include <stdio.h>

int main() {
	int n = 0;
	while (scanf("%d", &n) == 1) {
		int i = 0;
		int j = 0;
		for (i = 0; i < n; i++) {
			for (j = 0; j < n; j++) {
				if (i == 0 || j == 0 || i == n - 1 || j == n - 1) {
					printf("* ");
				}
				else {
					printf("  ");
				}
			}
			printf("\n");
		}
	}
	
	return 0;
}

13. 三角形判断(BC51)

#include <stdio.h>

int main() {
	int a = 0;
	int b = 0;
	int c = 0;
	while (scanf("%d %d %d", &a, &b, &c) == 3) {
		if ((a + b > c) && (a + c > b) && (c + b > a)) {
			if (a == b && b == c) {
				printf("Equilateral triangle!\n");
			}
			else if ((a == b && b != c) || (a == c && b != c) || (c == b && a != c)) {
				printf("Isosceles triangle!\n");
			}
			else {
				printf("Ordinary triangle!\n");
			}
		}
		else {
			printf("Not a triangle!\n");
		}
	}

	return 0;
}

14. 求 Sn = a + aa + aaa + aaaa + aaaaa 的前 5 项之和

其中 a 是一个数字

#include <stdio.h>

int main() {
	int a = 0;
    int n = 0;
    scanf("%d %d", &a, &n);
    int i = 0;
    int k = 0;
    int num = 0;
    for (i = 0; i < n; i++) {
        k = k*10 + a;
        sum += k;
    }
    printf("%d\n", sum);

	return 0;
}

15. 水仙花数

水仙花数是指一个 n 位数,其各位数字的 n 次方之和刚好等于该数本身。

#include <stdio.h>
#include <math.h>

int main() {
	int i = 0;
    for (i = 0; i <= 100000; i++) {
        //计算 i 的位数
        int n = 1;
        int tmp = i;
        while (tmp/10) {
            n++;
            tmp /= 10;
        }
        //得到 i 每一位,计算他的 n 次方之和
        int sum = 0;
        tmp = i;
        while (tmp) {
            sum += pow(tmp % 10, n);
            tmp /= 10;
        }
        if (sum == i) {
            printf("%d ",i);
        }
    }

	return 0;
}

不要在 for 循环中改变循环变量,创建临时变量 tmp 使用。

封装函数:

#include <stdio.h>
#include <math.h>

int isNarcissisticNumber(int i) {
    //计算 i 的位数
    int n = 1;
    int tmp = i;
    while (tmp/10) {
        n++;
        tmp /= 10;
    }
    //得到 i 每一位,计算他的 n 次方之和
    int sum = 0;
    tmp = i;
    while (tmp) {
        sum += pow(tmp % 10, n);
        tmp /= 10;
    }
    return sum == i;
}


int main() {
	int i = 0;
    for (i = 0; i <= 100000; i++) {
        if (isNarcissisticNumber(i)) {
            printf("%d ",i);
        }
    }

	return 0;
}

16. 打印菱形

#include <stdio.h>

int main() {
	int n = 0;
    scanf("%d", &n);
    int i = 0;
    //上半部分
    for (i = 0; i < n; i++) {
        int j = 0;
        for (j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (j = 0; j < 2 * i + 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    //下半部分
    for (i = 1; i < n; i++) {
        int j = 0;
        for (j = 0; j < i; j++) {
            printf(" ");
        }
        for (j = 0; j < 2*(n - i)-1; j++) {
            printf("*");
        }        
        printf("\n");
    }

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值