C/C++语言基础题...持续更新

目录

题记

1.矩阵转置

2.最大最小值

3.字符串

回文串

反转字符串

4.素数

5 回文和素数的结合


题记

回首往昔,自己学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指向同一个点当然也是相同的)

回文串

下面是一道回文串判断的题

1146:判断字符串是否为回文

#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; 
}

反转字符串

1144:单词翻转

需要用到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和它自身外没有其他因子的自然数。

下面是一道求素数个数的题。

1151:素数个数

#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)
}

1153:绝对素数

#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 回文和素数的结合

巩固一下回文串和素数

1129:统计数字字符个数

#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;			
 } 

如有错误,请大佬们斧正!!!

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值