题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分
本质上还是将数字反转,有符号时就直接分成两边后再反转,最难的是小数,坑比较多。。。
思路
将整数逆置的功能作为一个子函数,供其他函数调用,再写一个囊括其他功能的调用函数。
算了,算了,直接奉上来自蒟蒻两小时的代码。(哭
#include<stdio.h>
#include<string.h>
void integer(char *a){
int flag = 0, len = strlen(a);
for(int i = len - 1; i >= 0; i--) {
if(a[i] != '0'||i == 0) flag = 1;
if(flag == 1) printf("%c",a[i]);
}//这个应该都看得懂,那我就不说了
}
void all(char *a, int num, int flag) {
char left[21], right[21];
int len = strlen(a);
a[num] = '\0';//将符号作为分界线隔开两个位置
strcpy(left, a);//注意:strcpy(复制)遇到'\0'停止
if(flag == 1) {//如果是小数就找到没有0的地方开始
for(int i = num + 1; i < len; i++){
if(a[i] != '0'||num + 1 == len - 1) {//特判0.0的情况
strcpy(right, &a[i]);;
break;
}
}
}
else strcpy(right, &a[num + 1]);
if(flag == 1){
integer(left);
printf(".");
integer(right);
}
if(flag == 2){
integer(left);
printf("/");
integer(right);
}
if(flag == 3) {
integer(a);
printf("%%");//注意取模号要在前面加一个取模号才会输出 //原理目前我也不明白
}
}
int main(void){
int flag = 0, num;
char str[50], ch;
scanf("%s", str);
for(int i = 0; i < strlen(str); i++){
if(str[i] == '.') {
flag = 1;
num = i;
}
if(str[i] == '/') {
flag = 2;
num = i;
}
if(str[i] == '%') {
flag = 3;
num = i;
}
}//找到符号位置,并记录符号
if (flag == 0) integer(str);
else all(str, num, flag);
return 0;
}
需要注意的地方
strcpy
strpcy(即string copy)的原型:
char* strcpy (char* destinnation, const char* sourse)
strcpy会将源头(sourse)字符串包括’\0‘复制到目标字符串。由于sourse取得是数组地址,那我们就可以取数组中某一元素的地址,一直到'\0'结束的一段数组!
%%
取余号输出必须要写成这样的形式,我也不大明白,可能是关键字把。。。
注意特判小数,小数,小数!!!
小数可能的形式:0.0, 0.00123000
第一种要原样输出,第二个要去掉两边的0
ok题目讲解完毕,谁来救救蒟蒻!!