关于字符串与整数转化的问题:
数字统计
请统计某个给定范围[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(字符串名) 将字符串中小写字母换成大写字母