计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
解题思路
代码如下
#include<stdio.h>
int DigitSum(int n)
{
if (n>9)
{
return DigitSum(n / 10) + n % 10;
}
else
{
return n;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret=DigitSum(n);
printf("%d", ret);
return 0;
}
运行结果
字符串逆序(递归实现)
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
**要求:**不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
解题思路
在使用库函数的情况下
用左边的地址中的内容和最右边的地址中的内容交换
使用库函数strlen计算字符的长度
使用递归的方式实现
代码如下
使用库函数,并且不是递归方式的实现
#include<stdio.h>
#include<string.h>
void reverse_string(char *p)
{
char* l = p;
char *r = p+strlen(p) - 1;
while (l<r)
{
char temp = *l;
*l = *r;
*r = temp;
r--;
l++;
}
}
int main()
{
char arr[] = "abcedfg";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
不使用库函数,用递归方法实现
#include<stdio.h>
//计算字符串的长度
int My_strlen(char* p)
{
int count = 0;
while (*p)
{
count++;
p++;
}
return count;
}
//字符串逆序
void reverse_string(char* p)
{
int len = My_strlen(p);
char temp = p[0];
p[0] = p[len - 1];
p[len - 1] = '\0';
if (My_strlen(p+1)>=2)
{
reverse_string(p + 1);
}
p[len - 1] = temp;
}
int main()
{
char arr[] = "abcedfg";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
运行结果
使用循环的方式实现的结果
使用递归的方式实现的结果
交换数组
将数组A中的内容和数组B中的内容进行交换。(数组一样大)
解题思路
创立两个数组
创建一个临时变量用来交换数组中的元素
代码如下
#include<stdio.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
int b[5] = { 6,7,8,9,10 };
puts("交换前");
printf("数组a:");
for (int i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("数组b:");
for (int k = 0; k < 5; k++)
{
printf("%d ", b[k]);
}
printf("\n");
for (int i = 0; i < 5; i++)
{
int temp = b[i];
b[i] = a[i];
a[i] = temp;
}
puts("交换后");
printf("数组a:");
for (int i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
printf("\n");
printf("数组b:");
for (int k = 0; k < 5; k++)
{
printf("%d ", b[k]);
}
printf("\n");
return 0;
}
运行结果
对一个整型数组进行冒泡排序
实现整型数组的冒泡排序
解题思路
使用两个循环
外层循环控制冒泡排序的顺序
里层循环交换内容
代码如下
#include<stdio.h>
void BubbleSort(int* p, int sz)
{
for (int i = 0; i < sz-1; i++)
{
for (int j = 0; j < sz-i; j++)
{
if (p[j - 1] > p[j])
{
int temp = p[j - 1];
p[j - 1] = p[j];
p[j] = temp;
}
}
}
}
int main()
{
int arr[10] = { 12,45,3,61,13,56,96,46,123,456 };
int sz = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, sz);
for (int i = 0; i < sz-1; i++)
{
printf("%d", arr[i]);
}
return 0;
}
运行结果
交换两个变量
不允许创建临时变量,交换两个整数的内容
解题思路
可以通过^的方式来交换两个变量
代码如下
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
printf("交换前:\na=%d,b=%d", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("\n交换后:\na=%d,b=%d", a, b);
return 0;
}
统计二进制中一的个数
写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
解题思路
通过%2==1来确定二进制中是否是1
然后再/2才符合二进制的规则
代码如下
#include<stdio.h>
int count_one_bit(int n)
{
int count = 0;
while (n)
{
if (n%2!=0)
{
count++;
}
n = n / 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret=count_one_bit(n);
printf("%d", ret);
return 0;
}
运行结果
打印二进制中的奇数位和偶数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。文章来源:https://www.toymoban.com/news/detail-474163.html
解题思路
- 提取所有的奇数位,如果该位是1,输出1,是0则输出0
- 以同样的方式提取偶数位置
代码如下:
#include<stdio.h>
void Printbit(int n)
{
int i = 0;
//打印偶数位
for ( i = 31; i >= 1; i-=2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
//打印奇数位
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (n >> i) & 1);
}
printf("\n");
}
int main()
{
int n = 0;
scanf("%d", &n);
Printbit(n);
return 0;
}
运行结果
文章来源地址https://www.toymoban.com/news/detail-474163.html
到了这里,关于【C语言】编程练习(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!