文章目录
前言
从跨进三大到进工作室到现在,加起来也有两个多月的时间了。时间真的过得挺快的,下周就会进行的C语言分流考试了,虽然仗着高中学习过一部分语言知识目前学习起来压力不是很大,但是还是写一篇博客来总结一下一些基础的知识点和算法吧,也算是给这一段时间在工作室的学习来一个总结吧
提示:以下是本篇文章正文内容,下面案例可供参考
一、一些基础的题目和代码实现
1、输出所有的三位水仙花数
题目:请输出所有的水仙花数
样例输入:无
样例输出:153,370,371,407
方法一:分离每个数的个位十位百位
代码实现:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double ans = 0;
for(int i = 100;i<=999;i++){
int temp=i;
ans=0;
for(int j = 1;j<=3;j++){
ans=ans+pow(temp%10,3.0);
temp/=10;
}
if(ans == i) cout<<ans<<" ";
}
return 0;
}
方法二:三重循环来暴力模拟一个数的个位十位百位
代码实现:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double ans = 0;
for(int i = 1;i<=9;i++){
for(int j = 0;j<=9;j++){
for(int k = 0;k<=9;k++){
int temp=i*100+j*10+k;
if(temp == i*i*i+j*j*j+k*k*k)
cout<<temp<<" ";
}
}
}
return 0;
}
2、冒泡排序和选择排序
题目:请使用冒泡排序和选择排序分别对a,b两个数组进行排序
样例输入:输入n代表每个数组有多少个数,之后的两行,每行n个数,表示输入的数据
5
1 3 2 5 4
2 1 8 7 6
样例输出:
1 2 3 4 5
1 2 6 7 8
代码实现:
//选择排序和冒泡排序
#include <iostream>
#define N 20
int a[N+1];
int b[N+1];
using namespace std;
void selectsort(int num1[],int n){
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
if(num1[i] < num1[j]){ //以第一个数为基准数 内循环循环一次就可以将一个最大数放到尾部
swap(num1[i],num1[j]);
}
}
}
}
void bubblesort(int num1[],int n){
for(int i = 1;i<=n-1;i++){
bool flag=false; //标记每一轮是否有发生交换
for(int j = 1;j<=n-i;j++){
if(num1[j] > num1[j+1]){
flag=true;
swap(num1[j],num1[j+1]);
}
}
if(!flag) break; //如果没有发生交换 说明当前数列已经是有序的了 不再需要交换
}
}
int main(){
int n = 0;
cin>>n;
for(int i = 1;i<=n;i++)
cin>>a[i];
for(int i = 1;i<=n;i++)
cin>>b[i];
selectsort(b,n);
bubblesort(a,n);
cout<<"排序后的a数组为:";
for(int i = 1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl<<"排序后的b数组为:";
for(int i = 1;i<=n;i++){
cout<<b[i]<<" ";
}
}
3、求解n以内的所有素数
样例输入:5
样例输出:2 3 5
顺便记录一下筛选素数的方法:
①从2开始一直判断到n-1
②从2开始判断到sqrt(n)
③埃氏筛法
④欧拉筛法(利用最小质因子优化埃氏筛法)
代码实现:
//求解 n以内的所有素数
#include <iostream>
#include <cmath>
#include <cstring>
#define N 10000000
bool book1[N+1];
bool book2[N+1];
int a1[N+1];
int a2[N+1];
using namespace std;
void prime1(int n){
cout<<"不加任何优化的筛选:";
for(int i = 2;i<=n;i++){
bool flag=true;//默认为素数
for(int j = 2;j<i;j++){//从2筛选到i-1
if(i % j == 0){
flag=false;
break;
}
}
if(flag) cout<<i<<" ";
}
}
void prime2(int n){
cout<<"利用sqrt函数缩小筛选的范围的筛法:" ;
for(int i = 2;i<=n;i++){
bool flag=true;//默认为素数
for(int j = 2;j<=sqrt(i);j++){//从2筛选到i-1
if(i % j == 0){
flag=false;
break;
}
}
if(flag) cout<<i<<" ";
}
}
void prime3(int n){
cout<<"埃氏筛素数法:";
for(int i = 2;i<=n;i++){
if(book1[i]){
a1[i]=i;
book1[i]=false;
for(int j = 2*i;j<=n;j+=i){
book1[j]=false;
}
}
}
for(int i = 2;i<=n;i++)
if(a1[i]) cout<<a1[i]<<" ";
}
void prime4(int n){
cout<<"欧拉筛法:";
for(int i = 2;i<=n;i++){
if(book2[i]){
a2[i]=i;
book2[i]=false;
for(int j = 2*i;j<=n;j+=i){
int k = 2;
book2[j]=false;
if(j % a2[k++] == 0) break;//欧拉筛法的核心思想
}
}
}
for(int i = 2;i<=n;i++)
if(a2[i]) cout<<a2[i]<<" ";
}
int main(){
memset(book1,true,sizeof(book1));
memset(book2,true,sizeof(book2));
int n = 0;
cin>>n;
prime1(n);
cout<<endl;
prime2(n);
cout<<endl;
prime3(n);
cout<<endl;
prime4(n);
cout<<endl;
}
4、求最大公约数和最小公倍数
题目:给定两个数m,n,求他们的最大公约数和最小公倍数
样例输入:3,9
样例输出:3,9
数学知识:最大公约数乘以最小公倍数等于两个数的乘积
代码实现:
//求两个数的最大公约数和最小公倍数
//两个数的乘积等于最大公约数乘以最小公倍数
#include <iostream>
using namespace std;
int gongyue(int n,int m){
int q;
while(1){
q=n%m;
if(q == 0) return m;
else{
n=m;
m=q;
}
}
}
int gongbei(int n,int m){
int temp=gongyue(n,m);
int temp2=n*m;
return temp2/temp;
}
int main(){
int n,m;
cin>>n>>m;
cout<<"最小公约数为:"<<gongyue(n,m)<<endl;
cout<<"最大公倍数为:"<<gongbei(n,m)<<endl;
}
5、对字符串进行删除所有指定字符的操作
题目:给定一段字符串(可能包含空格)和一个字符,要求删除这个字符串中的所有给定的字符,如果该字符串中不包含有此字符,输出No Answer
样例输入:
love the world
o
样例输出:
lve the wrld
代码实现:
#include <iostream>
#include <cstring>
#include <cstdlib>
#define N 1000
char str[N+1];
bool book[N+1];
char word;
using namespace std;
int main(){
memset(book,true,sizeof(book));
int lenth = 0;
cin.getline(str,2000);
cin>>word;
lenth=strlen(str);
/*假删除实现
for(int i = 0;i<lenth;i++)
if(word == str[i]) book[i]=false;
for(int i = 0;i<lenth;i++){
if(book[i]) cout<<str[i];
}*/
for(int i = 0;i<lenth;i++){
if(str[i] == word){
for(int j = i;j<lenth;j++)
str[j]=str[j+1];
lenth--;//避免访问越界
}
}
str[lenth]='\0';//字符串末尾置结束符
for(int i = 0;i<lenth;i++){
cout<<str[i];
}
system("pause");
return 0;
}
6、自定义函数交换两个数的值
题目:给定两个数m,n,编写一个和swap有相同功能的函数
样例输入:5,3
样例输出:3,5
代码实现:
#include <iostream>
using namespace std;
void swap(int *m,int *n){
int temp=*m;
*m=*n;
*n=temp;
return;
}
int main(){
int m,n;
cin>>m>>n;
cout<<"交换前:"<<"m="<<m<<" "<<"n="<<n<<endl;
swap(&m,&n);
cout<<"交换后:"<<"m="<<m<<" "<<"n="<<n<<endl;
return 0;
}
7、行指针的使用
题目:无
样例输入:无
样例输出:无
代码实现:
//行指针的使用
#include <iostream>
#define N 10
using namespace std;
int main(){
int a[N+1][N+1];
int n = 0;
cin>>n;
int (*p)[N+1];//行指针中每行的个数这个参数要和被指向的二维数组的每行的元素个数相同 不然会报错
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
cin>>a[i][j];
p=a;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++)
cout<<*(*(p+i)+j)<<" ";
cout<<endl;
}
}
知识点:使用行指针指向某个二维数组的时候需要保证每一行的个数和二维数组每一行的个数相同,不然定义行指针的时候会报错
二、一些知识点的总结
1、sort函数
sort函数是c++自带的库函数,包含于algorithm头文件中,包含三个参数(首地址,末尾地址,排序方式)默认排序方式为升序排列,但是可以通过编写cmp函数作为第三个参数来改变sort函数的排序方式(此方式还可以来进行结构体数据的排序
2、多个字符串的保存方式
若直接使用C++,可以使用string类,直接创建一个string类型的数组对多个字符串进行保存。或者使用string类型的vector容器对多个字符串进行保存。
而如果是使用C语言的方式,则可以使用二维字符数组来进行保存。每一行保存一个字符串即可。
3、函数的递归运算
函数的递归运算,是指让函数自己调用自己,直到达到某个条件就开始递归返回,最终得到我们所需要得到的值,是一个不断重复的过程,并且这个过程必须有一个出口。但不断地递归运算需要在栈区不断地开辟空间,递归地次数过多会爆栈导致RE。
4、字符操作函数
C++库中的cctype是字符操作函数库,有如下几种常用的函数
isdigit() ->判断是否为数字
isalpha() ->判断是否为字母
islower() ->检测该字符是不是小写字母,如果是返回true
tolower()->如果是大写字母,则将其转换为小写字母
toupper()->如果是小写字母,则将其转换为大写字母
5、流输入输出和格式化输入输出
C++中有一种新的输入输出方式,即流输入输出。虽然这种输入输出方式不再需要我们制定格式,但这一种输入输出的方式会慢于格式化输入输出,因为其在输入或者输出之间都需要判断这个数据是什么样的数据类型,才能够对应输出。在数据量较大的时候,更加推荐使用格式化输入输出。
6、指针
最近才开始学习的指针,直接上上课做的笔记吧
指针![指针](https://i-blog.csdnimg.cn/blog_migrate/d9e6f783f6eda12148a912775692db56.jpeg)
1、动态分配内存函数malloc函数不一定会分配到一段连续的存储空间。如果是malloc(n*sizeof(int))那么就会分配n个大小为sizeof(int)的存储空间。但如果直接malloc(sizeof(int))那么分配到的就不一定会是一个连续的存储空间了
2、不同位数的编译器下,指针的占用字节的空间是不同的。在32位(x86)的编译环境下,不管是什么类型的指针,都占用4个字节。而在64位(x64)的编译环境下,无论是什么类型的指针,都占用8个字节
3、
总结
提示:这里对文章进行总结:
例如: