【趣学C语言和数据结构100例】
问题描述
-
利用递归函数调用方式,将所输入的 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*4printf("输求不超过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;
}