1.计算输入一个数的二进制中1的个数
方法一:
#include<stdio.h>
void Count(int n)
{int count = 0;int i = 0;int tmp = 0;for (i = 1;i <= 64;i++)//这里是在64位环境下编码进行的,如果是在32位环境下,需要将循环次数改为32{tmp = n & 1;if (tmp == 1){count++;}n = n >> 1;}printf(count = "%d\n", count);
}int main()
{int n = 0;scanf_s("%d", &n);Count(n);return 0;
}
运行结果如下:
方法一虽然能够正确计算二进制数中1的个数,但是固定了循环次数,每次计算都需要遍历64(或32)次,可能会造成资源浪费,下面进行改进。
方法二:
#include<stdio.h>
void Count(int n)
{int count = 0;while (n){n = n & (n - 1);count++;}printf("count = %d\n", count);
}
int main()
{int n = 0;scanf_s("%d", &n);Count(n);return 0;
}
运行结果如下:
2.某人需要走n阶台阶,一次可以选择走一阶或两阶台阶,问走完n阶台阶共有多少种方法?
这是一个典型的斐波那契数列问题。可以使用递归或动态规划来解决。
方法一:递归
#include <stdio.h>int climbStairs(int n) {// base casesif (n <= 2) {return n;}// recursive casereturn climbStairs(n - 1) + climbStairs(n - 2);
}int main() {int n;printf("请输入楼梯的阶数:");scanf("%d", &n);int ways = climbStairs(n);printf("走到楼梯顶部的走法总数:%d\n", ways);return 0;
}
方法二:动态规划
#include <stdio.h>int climbStairs(int n) {if (n <= 2) {return n;}int prev1 = 1;int prev2 = 2;int curr;for (int i = 3; i <= n; i++) {curr = prev1 + prev2;prev1 = prev2;prev2 = curr;}return curr;
}int main() {int n;printf("请输入楼梯的阶数:");scanf("%d", &n);int ways = climbStairs(n);printf("走到楼梯顶部的走法总数:%d\n", ways);return 0;
}
以递归代码运行为例,结果如下:
3.输入10个整数(可以有重复数据),现删除指定数据,并输出删除后的序列,且未删除的数据的前后位置不变
代码如下:
#include<stdio.h>
void Del(int* arr,int del,int N)
{int i = 0;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]);}
}int main()
{int N = 10;int arr[10] = { 0 };int i = 0;for (i = 0;i < N;i++){scanf_s("%d", &arr[i]);}int del = 0;scanf_s("%d", &del);Del(arr,del,N);return 0;
}
代码运行结果如下:
4.编写一个程序,输入一个字符串,判断该字符串是否为回文字符串(正序和倒序相同)。 如果是回文字符串,则输出"是回文字符串",否则输出"不是回文字符串"。
#include <stdio.h>
#include <string.h>int isPalindrome(char str[]) {int len = strlen(str);int i, j;for(i = 0, j = len-1; i < j; i++, j--) {if(str[i] != str[j]) {return 0;}}return 1;
}int main() {char str[100];printf("请输入一个字符串:");scanf("%s", str);if(isPalindrome(str)) {printf("是回文字符串\n");} else {printf("不是回文字符串\n");}return 0;
}
输出:
请输入一个字符串:abcdcba
是回文字符串
5.编写一个程序,输入一个正整数n,将该整数分解为若干个素数的乘积。 例如,输入数值为20,可以分解为2 * 2 * 5
#include <stdio.h>int isPrime(int num) {if(num <= 1) {return 0;}for(int i = 2; i * i <= num; i++) {if(num % i == 0) {return 0;}}return 1;
}void primeFactorization(int n) {printf("%d可以分解为素数的乘积:", n);for(int i = 2; i <= n; i++) {if(isPrime(i) && n % i == 0) {printf("%d ", i);n /= i;i--;}}printf("\n");
}int main() {int n;printf("请输入一个正整数:");scanf("%d", &n);primeFactorization(n);return 0;
}
输出:
请输入一个正整数:20
20可以分解为素数的乘积:2 2 5
该程序中包含了两个函数,isPrime用于判断一个数是否为素数,primeFactorization用于将一个正整数分解为素数的乘积。 首先需要调用isPrime函数来判断一个数是否为素数。isPrime函数通过遍历判断从2到i的平方根之间是否存在可以整除的数,如果存在,则该数不是素数,返回0;否则,返回1。 然后,在primeFactorization函数中,使用一个循环来遍历从2到n的数。首先判断该数是否为素数并且能够整除n,如果是,则打印该数并将n除以该数,再将循环变量i减1,以便继续检查是否有其他素数可以整除n。最后,输出结果。