洛谷P1553 数字反转(升级版)

这篇文章介绍了一个程序,用于将给定的数字(整数、小数、分数或百分数)的各个位进行反转。程序通过定义子函数处理整数反转,并根据输入类型(整数、小数、分数或百分数)进行相应处理。主要难点在于处理小数部分的反转,程序特别考虑了0.0和带有多个零的小数情况。
摘要由CSDN通过智能技术生成

题目描述

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与 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题目讲解完毕,谁来救救蒟蒻!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值