字符串及数组的相关算法

1、输入一串字符,在指定的位置插入一个字符:

  4 main()
  5 {
  6     int i, p, length;
  7     char c, a[20], b[100] ={'0'};
  8     printf("please input address:\n ");
  9     scanf("%d",&p);
 10     getchar();
 11     printf("please input : \n");
 12     scanf("%c",&c);
 13     getchar();
 14     printf("please input your word:\n");
 15     scanf("%s",&a);
 16     printf("%s\n",a);
 17 
 18     length = sizeof(a)/sizeof(a[0]);
 19     printf("%d\n",length);
 20 
 21     for(i = 0; i < length; i++)
 {
 23         if(i < p-1)
 24         {
 25         b[i] = a[i];
 26         }
 27         else if(i == p-1)
 28         {
 29             b[i] = c;
 30         }
 31         else
 32         {
 33             b[i] = a[i-1];
 34         }
 35     }
 36     printf("%s\n%s\n", a,b);
 37 
 38 
 39 }

2、在字符串中插入另一段字符串:

  4int main()
  5 {
  6     int addr, length1, length2, i, length;
  7     char a[100], b[100], c[200];
  8    printf("please input your word (a)\n");
  9    scanf("%s",&a);
 10    getchar();
 11    printf("please input address\n");
 12    scanf("%d",&addr);
 13     getchar();
 14     printf("please input your modify word(b)\n");
 15     scanf("%s",&b);
 16 
 17     length1 = strlen(a);
 18     length2 = strlen(b);
 19     length = length1 + length2;
 20     printf("%d\t %d\t %d\n",length1,length2,length);
 21     for(i = 0; i < 100; i++)
 22     {      
             if(i < addr-1)
 24         {
 25             c[i] = a[i];
 26         }
 27         else if(i >= addr-1 && i < addr+length2-1)
 28         {
 29             c[i] = b[i-addr + 1];
 30         }
 31         else
 32         {
 33             c[i] = a[i-length2];
 34         }
 35         //c[i] = '\0';
 36     }
 37     c[length] = '\0';
 38     printf("%s\n%s\n%s\n",a,b,c);
 39     
        return 0;
 40 }

在做着两道题的过程中出现了一些问题我觉得是很有意义的,虽然这两个小问题卡了我个把小时。我觉得对以后应该会很有帮助。

①就是第一段代码中有一句话else if(i == p-1)当时把==写成了=结果编译也没有报错,运行之后成程序不退出一直在执行。

②第二段代码中编译很成功没有错误和警告,结果是把第二段代码可复制过去之后,原本之后的代码却不见了,这个确实花了很长时间,上面第二段代码的27行else if(i >= addr-1 && i < addr+length2-1)后面i < addr+length2-1一开始写成了addr + length2没有减一,与我们常识一样,其实数组是从零开始的所以第length位其实是'\0';

3、经过半天的复习加运用,现在可以较为灵活的运用数组了,比如下面这题:

题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

解法:①利用数组存储n值并赋值连续的1 2 3,②再将数组中所有3改为零;③接着用count来统计数组中所有不为零的数,到三个时即count=3时复位并且把a[i] = 3;④循环上面②③过程,最终不为零的数的下标加一即最后的人;代码如下:

  4 {
  5     int a[100], i, j, k;
  6     int count = 0, n;
  7     printf("please input a number\n");
  8     scanf("%d",&n);
  9     for(i = 0; i < n; i++)
 10 
 11     {
 12         if((i + 1) % 3 == 0)
 13              a[i] = 3;
 14         else if((i + 1) % 3 == 1)
 15              a[i] = 1;
 16          else
 17              a[i] = 2;
 18          printf("%d\t",a[i]);
 19     }
 20     printf("\n\n");
 21 
 22     for(k = 0; k < sqrt(n)+1; k++ )
 23     {
 24          for(j = 0; j < n; j++)
 25          {
 26              if(a[j]%3 == 0)
 27                  a[j] = 0;
 28          }
 29          for(i = 0; i < n; i++)
 30          {
 31             if(a[i] != 0)
 32             {
 33                 count++;
 34                 if(count % 3 == 0)
 35                 {
 36                     a[i] = 3;
 37                      count = 0;
 38 
 39                  }
 40             }
 41         }
 42 
 43     }
    }                                                                                                

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值