• 关于字符串与整数转化的问题与一些常用字符串处理函数


    关于字符串与整数转化的问题:

    数字统计
    请统计某个给定范围[L, R]的所有整数中,数字2 出现的次数。
    比如给定范围[2, 22] ,数字2 在数2 中出现了1 次,在数12 中出现1 次,在数20 中出现1 次,在数21 中出现1 次,在数22 中出现2 次,所以数字2 在该范围内一共出现了6 次。

    【算法分析1】
    枚举[L,R]区间的所有整数,对于每个整数x:
    先判断x的最后一位是否为2(即 x%10==2),然后将x的最后一位删除(即 x/=10),循环操作,直到x值为0。
    【参考程序1】

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int main()
    {
           int l,r,ans=0;
           cin>>l>>r;
           for (int i=l; i<=r; ++i)
      {
    	int x=i;
    	while (x>0) 
        {
    	       if (x%10==2) ++ans;
    	       x/=10;
    	}
           }
           cout<<ans;
           return 0;
    }
    

    算法一大概是正常的想法,但是也可以把输入的每个数字先看做字符形式,直接查找字符为“2”的字符进行计数输出:

    【算法分析2】
    枚举[L,R]区间的所有整数,对于每个整数x:
    1.将整数x转化成字符串s,可以用sprintf(s,"%d",x)来实现;
    2.枚举字符串s的每个字符判断是否为2。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    char s[10];
    int main()
    {
    	int l,r,ans=0;
    	cin>>l>>r;
    	for (int i=l; i<=r; ++i)
    	{
    	      sprintf(s,"%d",i);
    	      l=strlen(s);
    	      for (int j=0; j<=l-1; ++j)
    	           if (s[j]=='2') ++ans;
    	}
      	cout<<ans;
      	return 0;
    }
    

    当然我们需要输出该“字符”时,就要用到整数与字符之间的相互转换:

    我们可以通过下面的题目来进行了解:

    数字反转:
    给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零
    【算法分析1】
    1.将整数N转化成字符串s,可以用sprintf(s,"%d",N)来实现;
    2.对字符串进行反转操作;
    3.将字符串s转换成数字N,可以用sscanf(s,"%d",&N)来实现。
    4.输出数字N。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    char s[100],c[100]; 
    int main()
    {
          int n,l;
          cin>>n;
          sprintf(s,"%d",n);
          l=strlen(s);
          for (int i=0; i<=l-1; ++i)  c[l-i-1]=s[i];
          if (n<0) cout<<"-";
          sscanf(c,"%d",&n);
          cout<<n;
          return 0;
    }
    

    字符串处理函数:
      系统提供了一些字符串处理函数,用来为用户提供一些字符串的运算。常用的字符串函数补充介绍如下:
    strcat(字符串名1,字符串名2) 将字符串2连接到字符串1后边,返回字符串1的值。
    strncat(字符串名1,字符串名2,长度n) 将字符串2前n个字符连接到字符串1后边,返回字符串1的值。
    strcpy(字符串名1,字符串名2) 将字符串2复制到字符串1后边,返回字符串1的值。
    strncpy(字符串名1,字符串名2,长度n) 将字符串2前n个字符复制到字符串1后边,返回字符串1的值。
    strcmp(字符串名1,字符串名2) 比较字符串1和字符串2的大小,比较的结果由函数带回;
    如果字符串1>字符串2,返回一个正整数;
    如果字符串1=字符串2,返回0;
    如果字符串1<字符串2,返回一个负整数;
    strncmp(字符串名1,字符串名2,长度n) 比较字符串1和字符串2的前n个字符进行比较,函数返回值的情况同strcmp函数;
    strlen(字符串名) 计算字符串的长度,终止符’’不算在长度之内
    strlwr(字符串名) 将字符串中大写字母换成小写字母
    strupr(字符串名) 将字符串中小写字母换成大写字母

  • 相关阅读:
    点双连通分量模板
    Caocao's Bridges HDU
    边双连通分量模板
    夏令营501-511NOIP训练18——高三楼
    夏令营501-511NOIP训练17——蛇形矩阵
    夏令营501-511NOIP训练16——数字转换
    模板——最小费用最大流
    洛谷P1792——[国家集训队]种树
    XJOI夏令营501-511NOIP训练14——好朋友
    codeforces 1178E-Archaeology
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12130044.html
Copyright © 2020-2023  润新知