![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++程序设计练习
aaronymhe
fighting
展开
-
自己实现strcat函数
问题描述:自己实现一个MyStrcat函数,要和C语言库函数的strcat函数完成同样的功能。问题分析: 首先我们要了解一下strcat函数它到底做了什么事情(1) 函数原型 char *strcat(char *dest, const char *src);(2) 函数说明dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 字符串复制到参数 dest 所原创 2017-07-06 21:41:55 · 38367 阅读 · 4 评论 -
正整数表示为连续自然数的和(难度:1颗星)
问题描述:输入一个正整数N,输出能相加等于N的联系序列的和(序列必须多于1项),如果这种序列存在,则输出所有这样的序列,如果不存在,则输出NULL。例如:输入为15 输出: 1+2+3+4+5=15 4+5+6=15 7+8=15首先我们先分析一下这个问题: 1. 首先1和2是不能表示成连续的自然数之和的,所以我们从3开始 2. 假设n可以表示成连续的自然数之和【s,t】,那么根据求原创 2017-05-09 22:47:56 · 13835 阅读 · 1 评论 -
运算符作业
作业描述: 参考代码:#include <stdio.h>int GetAbsoluteValue(int num)//求绝对值{ return num > 0 ? num : -num;}double GetAbsoluteValue2(double num){ return num > 0 ? num : -num;}double GetSqrt(double num)原创 2017-04-27 01:30:41 · 11508 阅读 · 0 评论 -
尼克切斯定理(难度:2颗星)
问题描述:根据尼克切斯定理的描述,任何一个正整数N的立方都可以写成一串连续奇数的和,根据该定理,我们输入一个N(N的范围是【2,1000】),输出N的立方所有能够满足的等式(连续奇数序列的长度必须大于1才输出)。输入样例: 5输出样例: 5 * 5 * 5 = 125 = 21 + 23 + 25 + 27 + 29首先我们先分析一下这个问题: 1. 假设n 的立方等于cube,并且cube原创 2017-05-27 18:52:16 · 13778 阅读 · 1 评论 -
哥德巴赫猜想(难度:1颗星)
问题描述:哥德巴赫猜想的一种描述是,大于4的正偶数(我们假定1不是质数)都能分解成两个质数之和,我们假设这个猜想成立,我们现在输入一个大于4的正偶数N,输出所有能够满足哥德巴赫猜想的等式。(其中N的范围是【4,100000000】)输入样例: 100输出样例: 100 = 3 + 97 100 = 11 + 89 100 = 17 + 83 100 = 29 + 71 100 = 41原创 2017-05-27 18:09:18 · 11475 阅读 · 0 评论 -
输出三角形面积和类型(难度:半颗星)
问题描述:输入三条边的边长,如果这三条边可以构成三角形,输出三角形的面积(保留到小数点后6位)和类型,否则输出“不能构成三角形”PS:从上到下依次检测三角形的类型,只要有一个满足后面不用再检测了,直接输出即可:等边三角形 等腰三角形 直角三角形 普通三角形参考代码#include <stdio.h>#include <math.h>int main(){ double a, b,原创 2017-05-27 17:27:44 · 11235 阅读 · 0 评论 -
求a的b次幂的最后3位(难度:1颗星)
问题描述:输入a,b,其中a和b的范围是【2,999999999】,求出a的b次幂的最后3位。PS: 如果最后三位是001,那么输出1就可以了。问题分析:这个问题的实际上是求a的b次幂mod 1000的结果,把这个问题一般化,实际上是a的b次幂mod n的结果。(X*Y)%Z=((X%Z)*(Y%Z))%Z 根据蒙格马利快速幂模算法,我们可以方便求解,下面举个例子。2^7:2*2*2*2*2*2原创 2017-05-27 17:05:11 · 15870 阅读 · 0 评论 -
打渔晒网问题(难度:1颗星)
问题描述:如果1个渔夫从2011年1月1日开始每3天打一次渔,两天晒一次网,编程实现当输入2011年1月1日之后的任意1天,输出该渔夫是在打渔还是在晒网。输入样例 2011 5 5输出样例 晒网参考代码:#include <stdio.h>int arr[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int IsLeapYea原创 2017-05-27 15:56:23 · 11220 阅读 · 0 评论 -
这一天是星期几(难度:1颗星)
问题描述:输入1个日期,日期的格式由3个正整数组成(正整数之间用空格分开),输出这一天是星期几,如果日期不合法,比如:2008 1 32(这个就不合法,因为天数超过了1月的最大天数31),直接输出“输入日期无效”,否则输出这一天是星期几。输入举例:2017 1 1输出结果: 星期天参考代码:#include <stdio.h>int arr[] = { 0, 31, 28, 31, 30, 31,原创 2017-05-27 15:42:16 · 10732 阅读 · 0 评论 -
随机生成数字放入数组(难度系数:1颗星)
随机生成1-6的数字放入到大小为56的数组中,保证数组最终每个数字出现的次数均为偶数。参考代码1:#include <stdio.h>#include <time.h>#define TOTALNUM 56int arr[TOTALNUM];int main(){ int i; srand((unsigned int)time(NULL)); for (i = 0;原创 2017-04-25 01:59:56 · 17038 阅读 · 0 评论 -
质数的和(多种方案)
求某个范围内质数的和,例如输入100,则求出小于100的质数和。PS:下面的三种方法会逐步缩小遍历查找的范围方法1:#include<stdio.h>int IsPrime(int n){//判断n是否为质数,如果是返回1,否则返回0 int i; for (i = 2; i < n; i++)//这个地方的遍历范围是【2,n】,在方法2中会缩小遍历范围 {原创 2017-05-07 17:31:44 · 15237 阅读 · 1 评论 -
简单序列求和
问题描述:求下列序列的和: 1 + (1 + 2) + (1 + 2 + 3) + … + (1 + 2 + 3 + … + n)比如当n输入为3的时候,则和为1 + 3 + 6 = 10参考代码1:#include <stdio.h>int main(){ int n; printf("输入求和的最大项数: "); scanf_s("%d", &n); int原创 2017-05-07 17:44:49 · 12824 阅读 · 1 评论 -
找出这个数(难度:半颗星)
求一个正整数,这个数满足如下条件: 1. 这个数的平方必须是四位数 2. 这个数的三次方必须是六位数 3. 而且这四位数和六位数每位数都不一样。参考代码:#include <stdio.h>int main(){ int i, j, GoNextLoop, flag[10], nCnt; for (i = 32; i < 100; i++)//在平方必须是四位数的范围内原创 2017-05-25 13:41:16 · 13139 阅读 · 0 评论 -
最大公约数和最小公倍数(难度:半颗星)
问题描述:输入两个正整数,输出两个正整数的最大公约数和最小公倍数。例如: 输入:30 50 输出: 最大公约数:10 最小公倍数:150思路1: 如果输入a,b,求出a,b总较小的那个赋值给c,在【c,1】这个范围内从大到小遍历,能同时被两个数整除即为最大公约数d,最小公倍数即为a*b/d。思路2: 利用辗转相除法,根据定理gcd(a, b) = gcd(b, a%b)方法1: 按照思原创 2017-05-15 00:10:45 · 10780 阅读 · 0 评论 -
分解质因数(难度:半颗星)
问题描述:输入一个正整数,输出它的质因数分解的结果。 PS:质因子从小到大排列例如: 输入:30 输出:30=2*3*5输入:5 输出:5=5参考代码:#include <stdio.h>int main(){ int i, n; printf("输入一个正整数n:"); scanf_s("%d", &n); printf("%d=", n); fo原创 2017-05-14 23:49:49 · 10851 阅读 · 1 评论 -
KMP快速查找字符串
问题描述: 使用KMP算法快速查找字符串(可支持中文)PS: 解析KMP的方法虽然多种多样,但是我仍然最喜欢数据结构书中我认为最经典的那种 参考代码:#include <iostream>#include <string>#include <vector>using namespace std;int KMPAlgorithm(const wstring& strText, const原创 2017-04-28 00:57:13 · 11374 阅读 · 0 评论 -
生成连连看地图(难度:1颗星)
问题描述:输入m和n(保证m*n是偶数),生成一个m*n的二维矩阵,其中用数字1-5来表示不同的图案,需要满足每一个数字在矩阵中出现的次数为偶数,并且是随机的。问题分析:为了要保证每个数字都是随机的,肯定要用到srand函数为了要每个数字在矩阵中出现的次数是偶数,并且要控制进行的次数,最后是先产生矩阵个数的一半,然后另外一个复制前面一半的值,这样就可以保证偶数的条件在做完第二步之后,我们需要进原创 2017-05-30 14:29:40 · 12720 阅读 · 0 评论 -
自己实现strcpy函数
问题描述:自己实现一个MyStrcpy函数,要和C语言库函数的strcpy函数完成同样的功能。问题分析: 首先我们要了解一下atoi函数它到底做了什么事情(1) 函数原型 char *strcpy(char *dest, const char *src);(2) 函数说明dest 为目标字符串指针,src 为源字符串指针,该函数把src所指的由NULL结束的字符串复制到dest 所指的数组中原创 2017-05-30 14:40:32 · 13026 阅读 · 0 评论 -
约瑟夫环问题(一)(难度:1颗星)
问题描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,任选一个正整数作为报数上限m,从第一个人开始按顺时针方向从自1开始顺序报数,报道m时停止报数.报m的人出列,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序.PS:m和n由用户输入,并且保证m和n的范围是【1,1000】,输出出列序列。问题分析:因为这个是要求出所有的出列序列,所以目前原创 2017-06-04 16:14:26 · 12648 阅读 · 2 评论 -
约瑟夫环问题(二):(难度:2颗星)
问题描述:编号为1,2,…,n的n个人按顺时针方向围坐一圈,任选一个正整数作为报数上限m,从第一个人开始按顺时针方向从自1开始顺序报数,报道m时停止报数.报m的人出列,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止,输出最后一个出列的人的编号。输入输出描述:m和n由用户输入,并且保证m和n的范围是【1,10000000】,输出最后出列的编号。问题分析:为了方便说明,我原创 2017-06-04 17:02:09 · 15689 阅读 · 0 评论 -
括号匹配检测(难度:半颗星)
问题描述:输入一个字符串,字符串中只包含两种字符:’(‘和’)’,判断字符串的括号是否匹配,如果匹配输出YES,否则输出NO。例如: (())是匹配的 ()))是不匹配的参考代码:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stack>std::stack<char>st;int原创 2017-06-03 18:13:07 · 13977 阅读 · 0 评论 -
可逆素数(难度:半颗星)
问题描述:可逆素数是指该数本身是一个素数,并且把该数倒过来也是一个素数。例如:1091是一个素数,把它倒过来1901也是一个素数,所以我们就说1091是一个可逆素数(同理1901也是一个可逆素数)输出所有范围在【1000,9999】并且各位数之和是11的整数倍的可逆素数。参考代码:#include <stdio.h>int IsPrime(int n){//判断n是否为质数,如果是返回1,否则返回原创 2017-06-03 16:00:53 · 19131 阅读 · 2 评论 -
求解同余方程组(难度:2颗星)
问题描述:有一个同余方程组,有N个同余方程组成(N由用户输入),另外每个同余方程的a[i]和m[i]也又用户指定,如下所示:x≡a[1](mod m[1]) x≡a[2](mod m[2]) x≡a[3](mod m[3]) x≡a[4](mod m[4]) … x≡a[n](mod m[n])求x的最小正整数解。问题分析:参考我的另外一篇文章“中国剩余定理” http://b原创 2017-06-02 22:43:09 · 14769 阅读 · 1 评论 -
求解二元一次方程(难度:2颗星)
问题描述:用户输入a,b,c三个整数,求解二元一次方程ax+by=c,如果(x,y)不存在整数解,则输出“No Solution”,否则输出一个整数解(x,y)使得x是最小正整数。解题思路:参考我的另外一篇文章“扩展欧几里得算法”http://blog.csdn.net/yi_ming_he/article/details/72819713参考代码:#include <stdio.h>typedef原创 2017-05-31 18:29:59 · 15198 阅读 · 0 评论 -
空瓶换汽水问题(难度:1颗星)
问题描述:超市规定每n个空汽水瓶可以换一瓶汽水,小李有m个空汽水瓶,最多可以换几瓶汽水(提示:可以先喝汽水,再还超市空瓶,但是一定要还哦)输入输出描述:n和m由外部输入的正整数,并且保证n的范围是【2,10000000】,m的范围是【1,10000000】,输出最多喝了多少汽水。问题分析:要求出最多喝了多少汽水,其实就是需要我们想到一种策略,能够尽可能的用完手中的空瓶,例如,如果我们手中有n-1个空原创 2017-06-04 17:21:33 · 12355 阅读 · 0 评论 -
自守数(难度:半颗星)
问题描述:如果一个数n是一个自守数,它必须满足如下条件: 1. 如果n有k位数构成,那么n的平方的末尾k位数必须和n相等例如: 25是一个自守数,因为 25 * 25 = 625,并且25等于625后面两位25输出【1,10000】范围内的自守数。参考代码:#include <stdio.h>int main(){ int i, num, temp, factor; for原创 2017-05-30 18:56:49 · 13653 阅读 · 0 评论 -
亲密数对(难度:半颗星)
问题描述:输出【1,100000】范围内的错有亲密数对。如果说n和m是一个亲密数对,那么它们必须满足以下条件 1. n的全部因子之和(不包括n)必须等于m 2. m的全部因子之和(不包括m)必须等于n例如: 220的全部因子之和为: 1+2+4+5+10+11+20+22+44+55+110=284284的全部因子之和为: 1+2+4+71+142=220所以220和284是一对个亲密数对原创 2017-05-30 18:45:45 · 24409 阅读 · 4 评论 -
等差数列(难度:半颗星)
问题描述:一个等差数列的前4个数之和是26,前4个数之积是880,输出这个等差数列的前10项。问题分析:设等差数列的首项为i,公差为j,那么等差数列的和与积分别可以表示为: sum=4 * i + 6 * j product = i * (i + j ) * (i + 2 * j) * (i + 3 * j)参考代码:#include <stdio.h>#include <math.h>int原创 2017-05-30 18:19:23 · 11919 阅读 · 0 评论 -
一数三平方(难度:半颗星)
问题描述:在【100000,999999】范围内找出符合以下条件的数并输出: 1. 该数本身是一个平方数 2. 该数的前3位也是一个平方数 3. 该数的后3位也是一个平方数参考代码:#include <stdio.h>#include <math.h>int main(){ int i, num0, num1, num2; for (i = 100000; i < 99原创 2017-05-30 17:59:11 · 12040 阅读 · 0 评论 -
特殊完全平方数(难度:半颗星)
问题描述:在【100,10000】的范围内找出所以满足以下条件的数并输出 1. 这个数是一个完全平方数 2. 这个数中某个数字出现的次数大于1次参考代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ int i, n, temp; int IsExist[10] = { 0 }, Is原创 2017-05-30 17:39:43 · 11882 阅读 · 0 评论 -
二进制转IP地址(难度:半颗星)
问题描述:任意数组32位的二进制数,转换成IP地址的形式输出。输入样例: 11111111000000001111111100000001输出样例: 255.0.255.1参考代码:#include <stdio.h>#include <stdlib.h>#include <time.h>int GetExponential(int a, int n)//求a的n次幂{ if (n原创 2017-05-30 17:23:44 · 11711 阅读 · 0 评论 -
分糖果问题(难度:1颗星)
问题描述:有n颗糖果,平均分给班上m个同学(m保证大于1),学生们按照任意顺序领取(反正大家数目都一样),第一个领取的是1颗加上剩余糖果数目的1/10,第二个领取的是2颗加上剩余数目的1/10,第三个领取的是3颗加上剩余数目的1/10,第四个领取的是4颗加上剩余数目的1/10,以此类推,求总共有多少糖果,班上有多少同学(如果有多个满足条件的答案,去n最小的那个)。问题分析:第一个同学取得的数目为:1原创 2017-05-30 16:54:37 · 12322 阅读 · 0 评论 -
根据日期判断天数(难度:半颗星)
问题描述:输入一个日期,判断这一天是这一年的第几天,如果输入日期不合法,比如:2008 1 32(这个就不合法,因为天数超过了1月的最大天数31),直接输出“输入日期无效”输入样例: 2008 3 20输出 这是 2008 年的 第 80 天参考代码:#include <stdio.h>int arr[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31原创 2017-05-14 23:25:31 · 10571 阅读 · 0 评论 -
计算两个日期的间隔天数(难度:1颗星)
问题描述:输入两个日期,日期的格式由3个正整数组成(正整数之间用空格分开),计算两个日期的差值(不管第一个输入的日期大还是第二个输入的日期大,始终用大的那个日期减去小的那个日期),如果两个日期中有一个不合法,比如:2008 1 32(这个就不合法,因为天数超过了1月的最大天数31),直接输出“输入日期无效”,否则输出两个日期的差值。输入举例:1999 1 21 2000 1 21那么输出的相隔的天原创 2017-05-14 23:12:36 · 10790 阅读 · 1 评论 -
完全平方数(难度:半颗星)
问题描述:找出范围是【0, 1000000】并且满足下面条件的整数,条件1: 它加上100是一个完全平方数 它加上268也是一个完全平方数输出所有满足条件的数。参考代码:#include <stdio.h>#include <math.h>int main(){ int i, temp1, temp2; for (i = 1; i <= 1000000; i++) {原创 2017-05-14 22:38:42 · 897 阅读 · 0 评论 -
简单求和题(初学)
输入一个范围【a,b】,输出这个范围内所有的偶数和参考代码1:#include <stdio.h>int main(){ int start, end, i, sum = 0; printf("输入两个数表示范围的左边和右边\n"); scanf_s("%d%d", &start, &end); start = start % 2 == 0 ? start : st原创 2017-05-04 11:24:07 · 13817 阅读 · 0 评论 -
使用switch-case语句输出成绩等级
问题描述: 输入一个0-100范围内发分数,在不同的等级范围内输出不同的值,要求使用switch-case控制 【0,60) 等级为E 【60,70) 等级为D 【70,80) 等级为C 【80,90) 等级为B 【90,100】 等级为A参考代码:#include <stdio.h>int main(){ double score; int nKey;原创 2017-05-04 11:19:00 · 71706 阅读 · 3 评论 -
数列的逆序数对(难度系数:2颗星)
给定一个数列,求数列的逆序数对总个数(逆序数对就是指数列中的两个数,排在前面的数比排在后面的数大,这样就构成了一个逆序数对)。例如: 4 2 1 3这个数列的逆序数对有: (4, 2);(4, 1);(4, 3);(2, 1);总共有4个逆序数对。PS:其实完全是使用了归并排序的思想,只是在合并的时候多加了一句统计该范围内的逆序数的个数,我们累加每一个小区间的逆序数个数,自然就得到了整个数列的逆序数原创 2017-05-12 00:24:01 · 12477 阅读 · 0 评论 -
计算π的值(难度系数:半颗星)
根据以下公式求π的值(要求精度0.0000000001,即某项小于0.0000000001时停止迭代)。输出结果精确到小数点后9位。参考代码:#include <stdio.h>#define eps 0.0000000001int main(){ double fenzi = 1; double fenmu = 3; double sum = 1; int nFe原创 2017-04-20 23:44:07 · 12170 阅读 · 1 评论 -
回文数(难度系数:半颗星)
输入一个数,判断它是不是回文数。例如12321是回文数,从左往右读和从右往左读是一样的。如果是回文数,输出YES,否则输出NO。原创 2017-04-20 23:37:50 · 11683 阅读 · 2 评论