临近期末,这些题不来看看吗?(下)
创始人
2024-02-22 17:58:50
0

目录

1、打印1~100之间所有3的倍数(三种方法)

2、写出3给整数从大到小输出

3、给定两个数,求这两个数的最大公约数

4、 递归实现n的k次方

5、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

6、编写一个函数 reverse_string(char * string)(非递归实现)

7、编写一个函数 reverse_string(char * string)(递归实现)


1、打印1~100之间所有3的倍数(三种方法)

法一:

让所有3的倍数与3求余都为0

#include 
int main()
{int i = 0;for (i = 1; i <= 100; i++){if (i % 3 == 0)printf("%d ", i);}return 0;
}

法二:

让调整部分每次循环+3

int main()
{int i = 0;for (i = 3; i <= 100; i += 3){printf("%d ", i);}return 0;
}

法三:

让条件判断部分每次*3

int main()
{int i = 0;for (i = 1; i * 3 <= 100; i++){printf("%d ", i * 3);}return 0;
}

2、写出3给整数从大到小输出

#include 
int main()
{int a = 0;int b = 0;int c = 0;//输入scanf("%d %d %d", &a, &b, &c);//排序//最大放在a中,最小放在c中,剩余放在a中就行if (a < b){int tmp = a;a = b;b = tmp;}if (a < c){int tmp = c;c = a;a = tmp;}if (b < c){int tmp = b;b = c;c = tmp;}//打印printf("%d %d %d", a, b, c);return 0;
}

3、给定两个数,求这两个数的最大公约数

法一:

解题思路:

首先最大公约数肯定不会超过两个数的最大值,所以先在a和b间找出最小值,再利用最小值分别对a、b求余,若两者余数都为0,说明就得到了最大公约数。

int main()
{int a = 0;int b = 0;//给定两个数scanf("%d %d", &a, &b);int k = (a > b ? b : a);//求a和b中最小值//a     bwhile (1) //只要k不为0继续判断                   //18    24{												//18	18if (a % k == 0 && b % k == 0)				//17	17{											//6		6break; //a、b只要分别和k求余为0,就得到最大公约数}k--;}printf("%d ", k);return 0;
}

法二:

辗转相除法:

想了解辗转相除法可以看看这个链接:https://zhuanlan.zhihu.com/p/171623230


#include 
int main()
{int a = 0;int b = 0;int k = 0;scanf("%d %d", &a, &b);while (k = a % b){a = b;b = k;}printf("%d\n", b);return 0;
}

4、 递归实现n的k次方

解题思路:

代码实现:

#include 
double Pow(int n, int k)
{if (k == 0){return 1.0;}else if (k > 0){return n * Pow(n, k - 1);}else //k<0{return 1.0 / Pow(n, -k);}}
int main()
{int n = 0;int k = 0;//输入scanf("%d %d", &n, &k);double ret = Pow(n, k);printf("%Lf\n", ret);return 0;
}

递归流程(画图)

递:递推(黑线)

归:回归(红线)

假设要计算2的3次方

5、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如:调用DigitSum(1729),则应该返回19

解题思路:

当n是一位数时,返回组成它的数字之和不就是n本身

当n是一位数以上时,可以想想是不是个位的数字非常好得到,只需让n%10即可,就举DigitSum(1729)可以传化成DigitSum(1729/10)+1729%10,接下来DigitSum(172/10)+172%10,这样以此类推下来不就是个递归吗

这题类似于按顺序打印每一位

https://blog.csdn.net/Weraphael/article/details/127831828

代码实现:

#include     
int DigitSum(int n)
{if (n <= 9) //若输入一位数,则返回对应的值{return n;}else //n>9{return DigitSum(n / 10) + n % 10;}
}
int main()
{int n = 0;//输入scanf("%d", &n);int ret = DigitSum(n);printf("%d\n", ret);return 0;
}

递归流程(画图)

递:递推(黑线)

归:回归(红线)

6、编写一个函数 reverse_string(char * string)(非递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:char arr[]="abcdef"
逆序后数组内容变成:fedcba

解题思路:

代码实现: 

#include 
#include 
int Strlen(char* string)//计算字符串长度
{int count = 0;while (*string != '\0'){count++;string++;}return count;
}
void reverse_string(char* string)
{int left = 0;int right = Strlen(string) - 1;while (left <= right){char tmp = string[left];string[left] = string[right];string[right] = tmp;left++;right--;}
}
int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s\n", arr);return 0;
}

程序结果:

 最后再给大家推荐一种写法

#include 
#include 
int Strlen(char* arr)//计算字符串长度
{int count = 0;while (*arr != '\0'){count++;arr++;}return count;
}
void reverse_string(char* arr)
{int left = 0;//左下标int right = Strlen(arr) - 1;//右下标while (left <= right){char tmp = *(arr+left);*(arr + left) = *(arr+right);*(arr + right) = tmp;left++;right--;}
}
int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s\n", arr);return 0;
}

中间部分代码解析:

数组名是首元素的地址,对于形参的arr,其实就指向了a的地址,接着arr+left,而left一开始为0,加0等于没加还是指向a的地址, 最后再进行解引用,就找到了a。*(arr+right)也是如此。这种写法和一开始写的没差,主要是为了方便大家理解。

7、编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:char arr[]="abcdef"

解题思路:

对于递归,可以拆成两步,第一步先交换a和f,第二步再调用reverse string(bcde),来逆序bcde。然后呢reverse string(bcde)又能拆成两步,第一步交换b和e。第二步再调用reverse string(cd),来逆序cd。接着reverse string(cd)又能拆成两步,第一步交换C和d,第二步调用reverse string(空字符串),调用空字符串时就能回归了,大概思路就是这样。

代码实现: 

#include 
int Strlen(char* string)//计算字符串长度
{int count = 0;while (*string != '\0'){count++;string++;}return count;
}
void reverse_string(char* string)
{int len = Strlen(string);//求字符串长度//交换char tmp = *string;                //*string = a *string = *(string + len - 1);     //*(string + len - 1) = f*(string + len - 1) = '\0';		   //防止递归乱套if (Strlen(string + 1) >= 2)       //防止死递归{reverse_string(string + 1);}*(string + len - 1) =  tmp;}
int main()
{char arr[] = "abcdef";reverse_string(arr);printf("%s\n", arr);return 0;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...