题目描述
任意给你一个整数,这个数可能很大(最长不超过100位),你能求出它的逆转数吗?
逆转数定义如下:
1.一个末尾没有0的整数,它的逆转数就是各位数字逆序输出;
2.一个负数的逆转数仍是负数;
3.一个末尾有0的整数,它的逆转数如同下例:
reverse (1200) = 2100
reverse (-56) = -65
要求定义并使用如下函数:
void reverse(char *str)
{
//函数求出str的逆转数并存入str。
}
输入描述
输入一个长整数str,不超过100位,输入的整数不含前导0。
输出描述
输出str的逆转数。输出占一行。
输入样例
-123456789000
输出样例
-987654321000
自己独立写了一种,又参考了下大佬们的
自己写的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse(char *str)
{
int flag=1;
//函数求出str的逆转数并存入str。
char* minus=strchr(str,'-');//如果是负数,找到负号位置
if(minus==NULL){
flag=0;//没负 号
}
int length=strlen(str);
int last=length-1;
if(str[last]!='0'){//末尾没0
char tempstr[102];
strcpy(tempstr,str);
if(flag==0){//为正数时
for(int i=0;str[i]!='\0';i++,last--){
str[i]=tempstr[last];
}
}
if(flag==1){//负数时
for(int i=1;str[i]!='\0';i++,last--){
str[i]=tempstr[last];
}
}
}
if(str[last]=='0'){//末尾有0
int sign=0;
for(int k=last;k>0;k--){
if(str[k]!='0'){
sign=k;//找到开始为0的位置
break;
}
}
last=sign;
char tempstr[102];
strcpy(tempstr,str);
if(flag==0){//为正数时
for(int i=0;i<=sign;i++,last--){
str[i]=tempstr[last];
}
}
if(flag==1){//负数时
for(int i=1;i<=sign;i++,last--){
str[i]=tempstr[last];
}
}
}
}
int main() {
char a[102];
fgets(a,sizeof(a),stdin);
a[strcspn(a, "\n")] = '\0';//清除fgets读入的换行符
reverse(a);
printf("%s\n",a);
return 0;
}
大佬写的:
#include<stdio.h>
#include<string.h>
#define N 102
//高效解法
void reverse(char ×str){
//函数求出str的逆转数并存入str
int i=0,j,len=strlen(str);
char t;
if(str[0]=='-') //判断负号
i++;
j=len-1;
while(str[j]=='0'){ //去后置0
j--;
}
while(i<j){ //中间交换(双指针思想)
t=str[i];
str[i]=str[j];
str[j]=t;
i++;
j--;
}
}
int main(){
char s[N];
scanf("%s",s);
reverse(s);
puts(s);
return 0;
}
仅供参考,忘了哪位大佬写的了