求一个函数,实现int类型截取任意位数。

女神打Boss 2015-08-31 03:52:34
如题例如:

int get_num(int num,int a, int b)
{//a表示从哪一位算起(1从个位算,2从十位算,3从百位算),b表示截取多少位
//例如:传入参数1234567,1,3
int new_num = 567;//怎样求得new_num = 567;
//return new_num ;
}


求函数实现
...全文
732 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcqm8888 2015-09-07
  • 打赏
  • 举报
回复
这个函数求出来没有啊,坚持下去。
lm_whales 2015-09-03
  • 打赏
  • 举报
回复
所以从算法考虑,除法,求余可能略微快一点,不过差别不大
lm_whales 2015-09-03
  • 打赏
  • 举报
回复
引用 21 楼 u013823973 的回复:
你们都是用除和取余,为什么我一时间想到的是字符串。。。。。
本质上是一样的,因为给出的是 int 类型数据 所以,字符串也是需要转换的,也还是要用到 除法,取余这一类的 不过,字符串取 从某位开始的多少位,更直观
难题 2015-09-02
  • 打赏
  • 举报
回复
你们都是用除和取余,为什么我一时间想到的是字符串。。。。。
lm_whales 2015-09-02
  • 打赏
  • 举报
回复
这里的问题,不是怎么写这个函数, 而是如何定义各种异常情况,如何处理各种异常情况。 如何定义位的含义, 第一位用C语言常用的 0 还是 其他语言的 1? 等等 这是个设计问题,不是编写,或者算法问题。 是个抉择的问题。 这就是详细设计需要面对的,详细设计设计好了。 代码一点都不麻烦。几乎可以直接一一对应。
赵4老师 2015-09-02
  • 打赏
  • 举报
回复
提醒:Win32下int的取值范围是-2147483648~2147483647
lm_whales 2015-09-02
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 lm_whales 的回复:]
支持。 但越界考虑的还是不够全面。[/quote] 嗯,返回 从 a 开始所有位 ,也要考虑起始位置问题。 统一返回 0 或者-1 ,就不用考虑了
赵4老师 2015-09-01
  • 打赏
  • 举报
回复
引用 15 楼 lm_whales 的回复:
越界,细分可分为起始位置 越界,和位数越界 起始位置越界 指的是,a 不在 num 位数之内,比如 -1, 或者比所有位数还要多 例如 num =1234567 ,a=10 位数越界指的是: a 在 位数之内。但是 b 比 a 之后的位数要多。 例如 num =1234567, a=4,b=7; 这种情况,有两种可选项,一种是 作为出错处理,返回 0 或者 -1 一种是,返回 从 a 开始所有位 例如567, 就是说 num =1234567, a=4,b=7; 和num =1234567, a=4,b=3;效果一致。 除此之外,位数的意义,也要定义好。 比如 a=0.算第一位。还是 a=1 算第一位 b=0,算一位,还是b =1 算一位。
支持。 但越界考虑的还是不够全面。
mujiok2003 2015-09-01
  • 打赏
  • 举报
回复
引用 12 楼 fly_dragon_fly 的回复:
查表可好
int pw10[11];
int get_num(int num,int a, int b)
{
    if(!pw10[0]){
        pw10[0] =1;
        for(int i=1;i<11;i++) pw10[i] =10*pw10[i-1];
    }
    return num /pw10[a-1] %pw10[b];
}
引用
until C++11, if one or both operands to binary operator % were negative, the sign of the remainder was implementation-defined, as it depends on the rounding direction of integer division.
这个好, 解决pw10越界 和 % 的operand为负数 的情况就完美了。
lm_whales 2015-09-01
  • 打赏
  • 举报
回复
越界,细分可分为起始位置 越界,和位数越界 起始位置越界 指的是,a 不在 num 位数之内,比如 -1, 或者比所有位数还要多 例如 num =1234567 ,a=10 位数越界指的是: a 在 位数之内。但是 b 比 a 之后的位数要多。 例如 num =1234567, a=4,b=7; 这种情况,有两种可选项,一种是 作为出错处理,返回 0 或者 -1 一种是,返回 从 a 开始所有位 例如567, 就是说 num =1234567, a=4,b=7; 和num =1234567, a=4,b=3;效果一致。 除此之外,位数的意义,也要定义好。 比如 a=0.算第一位。还是 a=1 算第一位 b=0,算一位,还是b =1 算一位。
lm_whales 2015-09-01
  • 打赏
  • 举报
回复
一种方式是先转换成 ASCII (字符串)表示,直接截取,再转回 int 注意特殊情况处理(越界处理,符号处理)
赵4老师 2015-08-31
  • 打赏
  • 举报
回复
1234567,8,1 期望得到0还是""?
fly_dragon_fly 2015-08-31
  • 打赏
  • 举报
回复
查表可好
int pw10[11];
int get_num(int num,int a, int b)
{
    if(!pw10[0]){
        pw10[0] =1;
        for(int i=1;i<11;i++) pw10[i] =10*pw10[i-1];
    }
    return num /pw10[a-1] %pw10[b];
}
chenxue0821 2015-08-31
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>
int check_num(int num, int a, int b){
	int length = 0;
	if(a <= 0 || b <= 0){
		return -1;
	}
	while(++length){
		if(num < pow(10, length)){
			break;	
		};
	}
	if(a + b - 1 > length){
		return -1;
	}
	return 0;
}

int get_num(int num,int a,int b){
	return num % (int)pow(10, a + b -1) / (int)pow(10, a - 1);	
}

int main(){
	int num = 1234567;
	int x = 4;
	int y = 3;
	if(check_num(num, x, y) != 0){
		printf("ERROR!\n");
		return -1;
	}
	int result = get_num(num, x, y);
	printf("result=%d\n",result);
	return 0;
}
chenxue0821 2015-08-31
  • 打赏
  • 举报
回复
int get_num(int num,int a,int b){
	return num % (int)pow(10, a + b -1) / (int)pow(10, a - 1);	
}
假正经的班长 2015-08-31
  • 打赏
  • 举报
回复
引用 6 楼 useprlove 的回复:
int get_num(int num, int a, int b){
	int k = 1;
	while(--a)num /= 10;
	while(b--)k *= 10;
	return num % k;
}
也可以参照@西伯利亚冰 不要要注意四舍五入(不可直接用int取整),所以其代码要修改为:
int get_num(int num,int a, int b){
    return num / int(pow(10.0, a-1) + .5)
		% int(pow(10.0, b-a+1) + .5);
}
// int(x + .5)可以实现对x四舍五入。
其实不需要四舍五入,而且int取整恰好是要忽略四舍五入。
宋寒松 2015-08-31
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <math.h>

int oct_power(int n)
{
    int value = 1;
    int i;

    for(i = 0; i < n; i++)
    {
        value *= 10;
    }

    return value;
}

int get_num(int num, int a, int b)
{
    int new_num = num;

    new_num /= oct_power(a - 1);
    new_num %= oct_power(a - 1 + b);

    return new_num;
}

int main(int argc, char* argv[])
{
    printf("%d\n", get_num(1234567, 1, 3));
    printf("%d\n", get_num(1234567, 3, 3));
    printf("%d\n", get_num(1234567, 5, 2));

    return 0;
}
赵4老师 2015-08-31
  • 打赏
  • 举报
回复
sprintf,sscanf
useprlove 2015-08-31
  • 打赏
  • 举报
回复
int get_num(int num, int a, int b){
	int k = 1;
	while(--a)num /= 10;
	while(b--)k *= 10;
	return num % k;
}
也可以参照@西伯利亚冰 不要要注意四舍五入(不可直接用int取整),所以其代码要修改为:
int get_num(int num,int a, int b){
    return num / int(pow(10.0, a-1) + .5)
		% int(pow(10.0, b-a+1) + .5);
}
// int(x + .5)可以实现对x四舍五入。
feng_ye2015 2015-08-31
  • 打赏
  • 举报
回复
新手只能到这一步了。。。
#include <iostream>
#include <cmath>

using namespace std;

int get_num(int num, int a, int b);

int main()
{
int num;
cout << "请输入数字:" << endl;

cin >> num;
int m = get_num(num, 1, 3);

cout << m << endl;

}

int get_num(int num, int a, int b)
{
int z;
int s = (int)pow(10.0, (double)b);
z = num%s;
return z;
}
加载更多回复(4)

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧