目录
题记
回首往昔,自己学C语言已经有一段时间了,在学习的过程中也遇到了很多的问题,也通过看其他大佬的博客得到解决。到今天,自己学有余力,准备记录一下自己的学习心得,帮助大家更好的理解题目。 近期的先从基础的开始写,到后面会慢慢的更新一些数据结构算法还有一些题,比如pat甲级乙级,蓝桥杯。
2021年11月10日
1.矩阵转置
将给定N*N矩阵右上角乘上某个数
以对角线为分割线 即i=j的时候就是对角线上的点。
#include<stdio.h>
int main()
{
int a[3][3]={
1,2,3,
4,5,6,
7,8,9
};
int i,j,m=3;//假设要乘的数为3,具体看题目来
for(i = 0;i < 3;i++) // 右上角*m
for(j = i; j < 3; j++)
a[i][j]*=m;
// for(i = 0; i < 3;i++) // 左下角*m
// for(j = 0;j <= i;j++)
// a[i][j]*=m;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 3;j++)
printf("%d ",a[i][j]);
puts("");
}
return 0;
}
N*N矩阵的变换 行变列
1 2 3 1 4 7
4 5 6 ->2 5 8
7 8 9 3 6 9
观察发现
1.可以按照对角线对称交换(条件N*N)
2.也可以新开一个数组把第一行存到一列第二行存到第二列这样子依次存下去.
3.变一下输出顺序,交换两个for循环。(推荐)
下面举一下列子(按对角线对称)。
#include<stdio.h>
int main()
{
int a[4][4]={
1,2,3,4,
5,6,7,8,
9,10,11,12,
13,14,15,16
};
int i,j;
for(i = 0;i < 4 ;i++)
for(j = 0;j < i;j++)
{
int t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
// for(i = 0;i < 3 ;i++) 错误写法 这样就相当于交换了两遍,矩阵没有变化
// for(j = 0;j < 3;j++)
// {
//
// int t = a[i][j];
// a[i][j] = a[j][i];
// a[j][i] = t;
//
// }
for(i = 0;i < 4;i++)
{
for(j = 0;j < 4;j++)
printf("%d ",a[i][j]);
puts("");
}
return 0;
}
下面给一道列题(交换两个for循环顺序)
#include<cstdio>
#include<iostream>
using namespace std;
int a[101][101];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0;i < n ; i++)
for(int j =0;j < m ;j++)
scanf("%d",&a[i][j]);
//当j = 0 , 第一行也就是a[0][0] a[1][0] a[2][0]....a[n-1][0]
// 这样相当先遍历第一列 然后第二列.... 就相当于转置了
for(int j = 0;j < m; j++)
{
for(int i = 0 ;i < n; i++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
2.最大最小值
求一个序列最大值 和 最小值
给出一到例题
#include<stdio.h>
int a[10010];
int Max_(int a[],int L)
{
int x = a[0]; // 假设第一个数最大
for(int i = 1;i < L; i++)
if(a[i] > x) x = a[i]; // 如果有比x数大的,那就把值给x
return x;
}
int Min_(int a[],int L)
{
int x = a[0];
for(int i = 1;i < L; i++)
if(a[i] < x) x = a[i];
return x;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0 ;i < n; i++) scanf("%d",&a[i]);
printf("%d",Max_(a,n)-Min_(a,n));
return 0;
}
3.字符串
回文串就是正着读和反转读都一样
思路可以让i指向头的位置,j指向尾部的位置,当i和j所指的值相等那就让i后移j前移,直到i > =j 结束 (i和j指向同一个点当然也是相同的)
回文串
下面是一道回文串判断的题
#include<stdio.h>
#include<string.h>
int main()
{
char str[110];
scanf("%s",str);
int n = strlen(str),i,j;
for(i = 0,j = n-1;i<j; i++,j--)
if(str[i] != str[j]) break;//当遇到不相等就结束
if(i >= j) printf("yes");//当i >= j 的时候也就是for循环不是break退出的
else printf("no");
return 0;
}
反转字符串
需要用到getline ,gets好像不让用了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string str;
getline(cin,str);//getline 可以读取带空格的
str += ' '; //方便最后一个单词的判断
int l = 0,f = 0;
for(int i = 0;i < str.size() ;i++)
{
if(str[i]==' ')
{
for(int j = l - 1; j >= f; j--)
printf("%c",str[j]);
printf(" ");
f = i + 1;
}
l++;
}
return 0;
}
4.素数
素数就是一个大于1的数,除了1和它自身外没有其他因子的自然数。
下面是一道求素数个数的题。
#include<stdio.h>
#include<string.h>
int check(int x)
{
int i;
for(i = 2;i <=sqrt(x); i++)
{
if(x % i == 0) return 0;//如果i是x的因子 则不是素数
}
return 1;//循环完毕后那么x就是素数
}
int main()
{
int n;
scanf("%d",&n);
int i , ans = 0;
for(i = 2;i <= n; i++)
{
if(check(i))
{
ans++;
//printf("%d ",i);
}
}
printf("%d",ans);
return 0;
//O(n^2)
}
#include<stdio.h>
#include<string.h>
int check(int x)
{
int i;
for(i = 2;i <=sqrt(x); i++)
{
if(x % i == 0) return 0;//如果i是x的因子 则不是素数
}
return 1;//循环完毕后那么x就是素数
}
int main()
{
int i;
for(i = 11;i <=99; i++)
{
int t = i%10*10 + i/10;//交换个位十位
if(check(i) && check(t))
{
printf("%d\n",i);
}
}
return 0;
}
当然素数还有速度更快的筛选算法,我会在别的文章进行更新。
5 回文和素数的结合
巩固一下回文串和素数
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int check_1(int x)//判断素数
{
for(int i = 2; i * i <= (x); i++)
{
if(x % i == 0) return 0;
}
return 1;
}
int check_2(int x)//判断回文
{
int t = x,ans = 0;
while(t) // 相当于反转
{
ans = ans * 10 + t % 10;
t /= 10;
}
if(ans == x) return 1;// 如果相等则范围真
return 0;
}
int main()
{
int n, cnt = 0;
scanf("%d",&n);
for(int i = 11; i <= n; i++)
{
if(check_1(i) && check_2(i)) cnt++;
}
printf("%d\n",cnt);
return 0;
}
如有错误,请大佬们斧正!!!