解题常用的两种将输入序列中的字符表示的数转化成对应进制的数值的方法
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进制),那这个函数就不可以使用了。
阅读更多相关文章推荐
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- oracle提供的关于数值或字符与其用于实际存储到硬盘上的编码值间以及不同进制的数值间的转化方法的总结[收集中]
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- Android开发:setAlpha()方法和常用RGB颜色表----颜色, r g b分量数值(int), 16进制表示 一一对应
- 多行文本框限制输入字符长度(两种方法)
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- C语言中不同进制数的输入输出及表示方法
- C++输入一个字符串,把其中的字符按照逆序输出的两种方法
- 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列12345是某栈的压入顺序,序列45321为该压栈序列对应弹出顺序。