您的位置:首页 > 其它

解题常用的两种将输入序列中的字符表示的数转化成对应进制的数值的方法

2017-11-22 00:04 211 查看

两种将输入序列中的字符表示的数转化成对应进制的数值的方法

我们知道,用户输入的数据都是以字符来存储的,最近我在练习一些题目时,发现很多题的程序中都需要包含一个流程——将字符串表示的数据转化成对应的数值形式存放到变量中。

第一种做法,只需要一次读取,下面是我使用C语言和C++实现这种方法:
C:

#include <stdio.h>
int main(void)
{
int sum = 0;
char ch;
while((ch = getchar()) != ' ')      //这里我假设输入样例以空格分割
sum = sum * 10 + ch - '0';      //'0'实际上就是整数值48【ASCII码】
printf("%d\n", sum);
return 0;
}

这里实际上就是从这一串数的最高位开始读取,比如一串字符形式的数据:123456,ch最先读取到’1’,之后我们将它转换成数值1并放到sum中,下一次循环读取了’2’,我们将sum乘10(实际上就是乘进制,可以理解成,我们将刚刚存入sum的数据全部向左移动一位),之后再加上这次的数值2,同样存放到sum中,这样最后sum中存放的就是数值形式的123456,我们可以将这个程序改进一下,并且写成一个单独的函数,使它便于在不同的情境下使用。

#include <stdio.h>
//参数carry表示进制,而c表示通过什么字符来判断这个数据全部读取完毕
int getNum(int carry, char c)
{
int ans = 0;
char ch;
while((ch = getchar()) != c)
ans = ans * carry + ch - '0';
return ans;
}

下面是C++版的这个函数:

#include <iostream>
int getNum(int carry, char c)
{
using namespace std;
int ans = 0;
char ch;
while((ch = cin.get()) != c)
ans = ans * carry + ch - '0';
return ans;
}

思路

这个思路是,顺序读取,由于不清楚有几位数,所以没来一位,就先以对应进制将原来已经有的数左移1位,数值上表现为乘上进制数,之后再将这个新读取进入的一位加进来。

接下来是第二种方法,我是在遇到了这样一道题目时采用了这个方法——这个题目的输入样例中,进制跟在要处理数值的后面,使用圆括号分割,这样我们就无法使用上面的方法了。
对于这种情况【这里假定输入样例就是120(3)这样类似的形式,表示3进制的120】可以构建一个下面这个函数,

C:

#include <stdio.h>
//参数用来判断在哪个符号后读取
int getNum(void)
{
int num, carry, ans = 0, power = 1;
scanf("%d(%d", &num, &carry);       //这里的num相当于是错误的以十进制存放了同样形式的carry进制数
while(num)
{
ans += num % 10 * power;
power *= carry;
num /= 10;
}
return ans;
}

思路

这个的思路是,使用一个变量标记对应位置的幂次,依次从最低位读取,乘上幂次,然后加到ans中。

注意适用范围

需要注意的是,如果输入样例中的进制不止于10进制(比如可能是16进制),那这个函数就不可以使用了。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐