【趣学C语言和数据结构100例】
问题概览
本文精选了五个编程问题,涉及递归、数字处理、字符串操作、组合数学和数论等多个领域。通过C语言实现,旨在提高编程能力和深化对算法的理解。
- 递归逆序打印字符:利用递归函数调用方式,将输入的5个字符以相反顺序打印出来。
- 正整数位数及逆序打印:给定一个不多于5位的正整数,求它是几位数,并逆序打印出各位数字。
- 回文数判断:判断一个5位数是否为回文数。
- 由0-7组成的奇数个数:求不超过n位数,且由0-7所能组成的奇数个数。
偶数分解为两个素数之和:一个偶数总能表示为两个素数之和。
问题描述
利用递归函数调用方式,将所输入的 5 个字符,以相反顺序打印出来
给定一个不多于 5 位的正整数,要求: 1. 求它是几位数,2. 逆序打印出各位数字
一个 5 位数,判断它是不是回文数。
求不超过 n 位数,且由 0-7 所能组成的奇数个数。
一个偶数总能表示为两个素数之和,即把一个偶数分解成两个素数。
代码分析
==26.递归的使用==
分析:之前提到过递归在与定义func,并在func中使用func,和递归的结束条件。相当于一个栈。先进后出。调用func,并传入参数5,只要n>1,那么就进行输入读取,并func(4),直到n=1时,进行返回,并输出。
所以大体为如下:
func(n){
定义字符串
if(n<=1){
输入最后一次
输出最后一次
}
else{
输入第1次
递归调用n-2
输出第1次 //先调用到最后一步,然后输出
}
}
==27.递归的深度即使用==
分析:之前提到过递归在与定义func
,并在func
中使用func
,和递归的结束条件。它是几位数,即递归的深度可以定义全局变量,在每次递归时进行计数。逆序打印,可参考26。本题采用==直接除==计算深度。逆序打印数字则采用%。
==28.判断是不是回文数==
分析:如 12321 是回文数,个位与万位相同,十位与千位相同。即:找到个位和万位,十位与千位进行比较。直接采用/和%进行计算即可。
==29.由 0-7 所能组成的奇数个数==
找规律:
1.最后一位为奇数1357 ,4种
2.如果n为2位数,则74 7是因为首数字不能为0
3.如果n为3位数,则78*4
==30.偶数分解成两个素数==
难点:判断一个数是否是素数
写一个函数Isprimer,则可以
Isprimer(n) && (x-n)来进行偶数分解成两个素数 判断一个数是否是素数 写一个for循环,到
sqrt(n)`,即平方根,如果n%i存在=0的情况则直接返回0,如果没有,则返回1。
代码实现
#include <stdio.h>
void func(int n){
char next;
if(n<=1){
next =getchar();
printf("输出相反结果为:");
putchar(next);
}
else{
next=getchar();
func(n-1);
putchar(next);
}
}
// 判断一个数是否是素数
int Isprimer(int n){
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
// 26.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
int i=5;
printf("输入递5个以内字符:");
func(i);
// 27.给定一个不多于5位的正整数,要求:1.求它是几位数,2.逆序打印出各位数字
int n,sum=0,temp;
printf("输入不多于5位的正整数:");
scanf("%d",&n);
temp=n;
for(int i=0;i<5;i++){
if(n!=0){
sum++;
n /= 10;
}
}
printf("它是%d位数\n",sum);
printf("逆序打印数字:");
while (temp != 0) {
printf("%d ", temp % 10); // 打印最后一位数字
temp /= 10; // 去掉最后一位数字
}
printf("\n");
// 28.一个5位数,判断它是不是回文数。
// 如 12321 是回文数,个位与万位相同,十位与千位相同
int a,b,c,d,e,f,x;
printf("输入5位的正整数:");
scanf("%d",&x);
a=x/10000;
b=x%10000/10;
c=x%10000/100;
d=x%10000/10;
e=x%10;
if(e==a && b==d){
printf("这个数是回文数");
}
else{
printf("这个数不是回文数");
}
// 29.求不超过n位数,且由 0-7 所能组成的奇数个数。
// 思路:
// 1.最后一位为奇数1357 ,4种
// 2.如果2位数,则7*4 7是因为首数字不能为0
// 3.如果3位数,则7*8*4
printf("输求不超过n(n>=2)位数,且由 0-7 所能组成的奇数个数。\n");
long s=4,sum=0,n;
printf("输入n位数的n:");
scanf("%d",&n);
for(int i=2;i<=n;i++){
if(i==2){
s *= 7;
}
else{
s *= 8;
}
sum += s;
}
printf("不超过8位数,且由 0-7 所能组成的奇数个数为%ld个。",sum);
// 30.一个偶数总能表示为两个素数之和,即把一个偶数分解成两个素数。
// 解析:重点在于要学会函数:判断一个数是否是素数
int n,i;
do{
printf("输入偶数:");
scanf("%d",&n);
}while(n%2!=0);
for(i=1;i<n;i++){
if(Isprimer(i)&&Isprimer(n-i)){
break;
}
}
printf("输入偶数%d解成两个素数%d和%d。",n,i,n-i);
return 0;
}
总结
本文精选了五个编程问题,涉及递归、数字处理、字符串操作、组合数学和数论等多个领域,通过C语言实现,旨在提高编程能力和深化对算法的理解。
递归逆序打印字符问题展示了递归函数的简洁与强大。通过递归调用,我们能够在不使用额外存储的情况下,以相反顺序打印输入的字符序列。
正整数位数及逆序打印问题不仅要求我们计算数字的位数,还要求逆序打印每一位数字。这个问题通过递归和循环两种方式实现,展示了不同解决问题的思路。
回文数判断问题要求判断一个五位数是否为回文数。通过比较数字的对称位,我们可以快速判断一个数是否为回文数,这个问题体现了数学在编程中的应用。
由0-7组成的奇数个数问题是一个组合数学问题。通过分析问题规律,我们能够计算出不超过n位数,且由0-7所能组成的奇数个数,这个问题展示了组合数学在编程中的实用价值。
偶数分解为两个素数之和问题是一个数论问题。通过编写一个判断素数的函数,我们可以将一个偶数分解为两个素数之和,这个问题不仅锻炼了编程能力,也加深了对数论的理解。
这些问题的解决不仅展示了C语言的灵活性和强大功能,也体现了算法设计的基本思想,如条件判断、循环控制和递归。通过这些算法的学习,我们可以更好地理解数据结构和算法的基本概念,提高解决实际问题的能力。
总的来说,这些算法问题不仅锻炼了编程能力,也加深了对数据结构和算法的理解。通过这些问题的解决,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。这些算法的掌握对于计算机专业的学生和软件开发人员来说都是非常重要的。通过这些练习,我们可以逐步提高自己的编程技能,为将来的学习和工作做好准备。同时,这些问题的解决也体现了算法在处理数据时的灵活性和效率,为我们在实际开发中遇到类似问题提供了解决思路。