算法学习之数组和字符串

简介:

数组和字符串

逆序输出
考虑问题:读入一些整数,逆序输出到一行中。已知整数不超过100个。
我们把每个数都存下来,存放到哪里呢?答案是:数组。

复制代码
#include <conio.h>
#include<stdio.h>
#define MAXN 100+10
int a[MAXN];
int main(){
    int i,x,n=0;
    while(scanf("%d",&x)==1){//一直输出
      a[n++] = x;
    }
    for(i = n-1;i>=1;i--){
      printf("%d ",a[i]);
    }
    printf("%d\n",a[0]);
    getch();
    return 0;
}
复制代码

逆序输出。

开灯问题
有n盏灯,编号为1~n。第一个人把所有灯打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关。
(其中关掉的灯将被打开,开着的灯将被关闭),依次类推。一共有k个人,问最后有哪些灯开着?
输入:
n和k,输出开着的灯编号。k<=n<=1000。
样例输入:7 3
样例输出:1 5 6 7
分析:用a[1],a[2],...,a[n]表示编号为1,2,3,...,n的灯是否开着。模拟这些操作即可。

复制代码
#include <conio.h>
#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
int a[MAXN];
int main(){
    int n,k,i,j,first = 1;//n,k用于输入,i,j用于循环,first标记第一个,第一个输出的有些特殊
    memset(a,0,sizeof(a));//用于清空数组,引入string.h
    scanf("%d%d",&n,&k);
    for(i=1;i<=k;i++){//一共执行k次
      for(j=1;j<=n;j++){//每次执行n下
        if(j%i==0){//j是i的整数倍,就执行相反动作
          a[j] = !a[j];
        }
      }
    }
    for(i=1;i<=n;i++){//循环输出
      if(a[i]){
        if(first){
          first = 0;
        }else{
          printf("  ");
        }
        printf("%d",i);//输出亮着的灯
      }
    }
    getch();
    return 0;
}
复制代码

 


蛇形填数
在n*n方阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n<=8。
分析:二维数组解决之。下,左,上,右,下...

复制代码
#include <conio.h>
#include<stdio.h>
#include<string.h>
#define MAXN 10
int a[MAXN][MAXN];//定义二维数组
int main(){
    int n,x,y,tot = 0;//n表示大小,x,y表示坐标。tot表示起始位置的值。
    scanf("%d",&n);//输入n的值
    memset(a,0,sizeof(a));//初始化数组
    tot = a[x=0][y=n-1] = 1;//第一个值得到了处理
    while(tot<n*n){//处理剩下的n*n-1个数
      while(x+1<n&&!a[x+1][y]){//满足两个条件,x+1<n并且a[x+1][y]必须为空
        a[++x][y] = ++tot;//使用之前先使加一,从第二个处理到最后一个
      }
      while(y-1>=0&&!a[x][y-1]){
        a[x][--y] = ++tot;//从最底边的第二个处理到最后一个
      }
      while(x-1>=0&&!a[x-1][y]){
        a[--x][y] = ++tot;//从最左边的第二个处理到最后一个
      }
      while(y+1<n&&!a[x][y+1]){
        a[x][++y] = ++tot;//从最上面的第二个处理到倒数第二个                         
      }
    }
    for(x = 0;x<n;x++){
      for(y=0;y<n;y++){
        printf("%3d",a[x][y]);//三个作为输出间隙
      }
      printf("\n");
    }
    getch();
    return 0;应有编号,之后应有一个空行。最后输出解得总数。
}
复制代码

小结:判断是关键,这里的循环处理很妙,判断更妙。跟着循环走一遍,分析一遍,发现刚好执行了n*n次,不多不少。
算法的效率非常的高。

字符数组。
竖式问题
找出所有形如abc*de的算式,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。
每个竖式前应有编号,之后应有一个空行。最后输出解的总数。
分析:尝试所有的abc和de,判断是否满足条件。C语言中的字符型用关键字char表示。存储的是字符的ASCII码。
scanf("%s",s)和scanf("%d",&n)类似,它会读入一个不含空格、TAB和回车符的字符串,存入字符数组s。注意,s前面没有&符号。
printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串。

复制代码
#include <conio.h>
#include<stdio.h>
#include<string.h>
int main(){
    int i,ok,abc,de,x,y,z,count=0;
    char s[20],buf[99];
    scanf("%s",s);
    for(abc = 111;abc<=999;abc++){
      for(de = 11;de<=99;de++){
        x = abc*(de%10);
        y = abc*(de/10);
        z = abc*de;
        sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);//写入字符串
        ok = 1;//相当于波尔值
        for(i = 0;i<strlen(buf);i++){
          if(strchr(s,buf[i]) == NULL){
            ok = 0;
          }
        }
        //判断所有的是否符合
        if(ok){
            printf("<%d>\n",++count);//输出个数
            printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
          }
      }
    }
    printf("The number of solutions = %d\n",count);
    getch();
    return 0;
}
复制代码

小结:作者很强大,太有才了。佩服。


本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/3226759.html,如需转载请自行联系原作者

相关文章
|
11月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
304 0
|
10月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
385 1
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
3081 11
架构学习:7种负载均衡算法策略
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
1017 23
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
262 7
|
9月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
777 0
|
9月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
488 2
|
10月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
395 3
|
9月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
395 8

热门文章

最新文章