[**算法**]关于数字反转的两道例题的分析思考

33 篇文章 0 订阅
17 篇文章 4 订阅

两个题目看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)还有一个是去处理整数

【深基2.例7】数字反转

题目描述

输入一个不小于 100 且小于 1000,同时包括小数点后一位的一个浮点数,例如 123.4 123.4 123.4 ,要求把这个数字翻转过来,变成 4.321 4.321 4.321 并输出。

输入格式

一行一个浮点数

输出格式

一行一个浮点数

样例 #1

样例输入 #1

123.4

样例输出 #1

4.321

我们用scanf控制输入,把整数部分和小数部分分开来做反转(因为小数部分只有一位,只做整数部分就行)

#include<bits/stdc++.h>
using namespace std;
int z,x,dz;
int main(){
	scanf("%d.%d",&z,&x);    //输入整数部分+小数点+小数部分
	while(z){                //愉快的反转环节
		dz=dz*10+z%10;
		z/=10;
	}
	printf("%d.%d\n",x,dz);  //就可以输出了
	return 0;
}

注意浮点数需要定义为float,在倒置数字时不要忘记了小数点

STL大法好!
首先拿到题目,第一感觉就是字符串,当然一个个读入在反过来输出也可以。

但字符串的反转操作我们可以用STL也可以直接倒序输出。

介绍一下STL里面的反转字符串函数
reverse()
reverse()

其格式是:

(
reverse( 数组名
.
(
)
.begin()
,
, 数组名
.



(
)
.end()
)
;
);

在此大呼一声:STL大法好!
你们最喜欢的代码:

#include<bits/stdc++.h>   //文件头
using namespace std;
string a;                 //定义字符串
int main() 
{
    cin>>a;               //输入
    reverse(a.begin(),a.end());  //反转
    cout<<a;              //输出
    return 0;             //养成好习惯
}

利用字符串进行处理
我们先来认识一下c++的字符串string,这个类型相当于c中char[],和char一样,string也可以用数组表示多个字符串,即string a[]。接下来看看常见的几个string类型操作:

string a;//定义一个string类字符串。

int len=a.size()//读取串a的长度,注意此时a中字符下标是从0开始的。

有了这些,我们便可以反转了!

#include<bits/stdc++.h>万能头文件
using namespace std;
string a;
signed main()
{
	cin>>a;
	int len=a.size();读取长度
	for(int i=len-1;i>=0;i--)反转
	cout<<a[i];
	return 0;
}

刷题积累

常用的输入控制符有:

%d:读入一个 32 位有符号整数。

%u:读入一个 32 位无符号整数。

%lld:读入一个 64 位有符号整数。

%llu:读入一个 64 位无符号整数。

%f:读入一个 float 类型。

%lf:读入一个 double 类型。

跟上一道题看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)下面这个是去处理整数

[NOIP2011 普及组] 数字反转

## 题目描述

给定一个整数 $N$,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。

## 输入格式

一个整数 $N$。

## 输出格式

一个整数,表示反转后的新数。

## 样例 #1

### 样例输入 #1

123


### 样例输出 #1

321


## 样例 #2

### 样例输入 #2

-380


### 样例输出 #2

-83


## 提示

**【数据范围】**

$-1,000,000,000\leq N\leq 1,000,000,000 $。

noip2011 普及组第一题

#include<bits/stdc++.h>
using namespace std;
int n,m=0;//当时看题解时忽略了这一个0,导致想了半天
int main(){
	cin>>n;
	while(n){                //判断是否反转结束
		m=m*10+n%10;   //取原数的最后一位补到结果后面
		n/=10;           //最后一位可以丢掉了
	}
	cout<<m<<endl;
	return 0;
}

样例分析:

第一个123输入后输出变为321

先进入while中 while不等于0那么并不会跳出循环,下来进入while循环中去,其中n=123对10取余后可得3,那么m=10m+3,m等于3。下来进入while中后n变为12,然后进入循环之中去,m=30+2=32 下来进入while中后n变为1,然后进入循环之中去,m=320+1+321 之后n=0,跳出循环输出m

第二个-380输入后输出变为-83
先进入while中 while不等于0那么并不会跳出循环,下来进入while循环中去,其中n=-380对10取余后可得0,那么m=10m+0,m等于0。下来进入while中后n变为-38,然后进入循环之中去,m=0+8=8 下来进入while中后n变为-3,然后进入循环之中去,m=-80+3=-83 之后n=0,跳出循环输出m

两个题目看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)还有一个是去处理整数

刷题积累

常用的输入控制符有:

%d:读入一个 32 位有符号整数。

%u:读入一个 32 位无符号整数。

%lld:读入一个 64 位有符号整数。

%llu:读入一个 64 位无符号整数。

%f:读入一个 float 类型。

%lf:读入一个 double 类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时雨h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值