任何一个伟大的目标,都有一个微不足道的开始~
(洛谷新手村标语,感觉挺励志的)
刚刚学习c语言一个学期,目前才刚刚开始接触算法,遇到很多问题都还只是会用很暴力的方法= 。=。突发奇想,想用博客来记录一下自己的成长。
现在就来写下自己的第一篇博客吧!
这是洛谷上面的一道题目,答案写了一百多行,有点恶搞的意思,但是我也只是想同时巩固一下自己这个学期学到的知识,加深对它们的理解,题目如下:
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
//纯属恶搞,敲一个超长代码hh
#include<stdio.h>
char num1[25] = "", num2 [25] = "";
void zhengshu(char *num,int i)
{
if( i == 0 )
{
printf("%s", num);
return ;
}
int z, t;
for( t = 0; t <= i/2; t++)
{
z = num[t];
num[t] = num[i-t] ;
num[i-t] = z;
}
while(num[0] == '0' && i != 0)
{
num ++;
i --;
}
printf("%s", num);
}
void xiaoshuhou(char *num,int i)
{
if( i == 0)
return ;
int z, t;
for( t = 0; t <= i/2; t++)
{
z = num[t];
num[t] = num[i-t] ;
num[i-t] = z;
}
while(num[i] == '0' && i!= 0)
{
num[i--] = '\0';
}
printf("%s", num);
}
void fenshu(char *num)
{
int i ;
for( i = 0; num[0] != '/'; num++,i++)
num1[i] = num[0];
zhengshu(num1 , i - 1);
num++;
for( i = 0; num[0] != '\0'; num++,i++)
num2[i] = num[0];
printf("/");
zhengshu(num2 , i - 1);
}
void baifenshu(char *num , int bai)
{
zhengshu(num,bai);
printf("%", num);
}
void xiaoshu(char *num)
{
int i ;
for( i = 0; num[0] != '.'; num++,i++)
num1[i] = num[0];
zhengshu(num1 , i - 1);
num++;
for( i = 0; num[0] != '\0'; num++,i++)
num2[i] = num[0];
printf(".");
xiaoshuhou(num2 , i - 1);
}
int main()
{
int i ,bai = 0,/*xiao = 0,fen = 0,*/ shape = 0;
char num[50] = "" ;
scanf("%s", num);
for(i = 0; num[i] != '\0'; i++)
{
if (num[i] == '.')
{
shape = 1;
// xiao = i;
break ;
}
if (num[i] == '%')
{
shape = 2;
bai = i;
break ;
}
if (num[i] == '/')
{
shape = 3;
// fen = i;
break ;
}
}
switch(shape)
{
case 0: zhengshu(num,i-1); break;
case 1: xiaoshu(num ); break;
case 2: baifenshu(num, bai-1); break;
case 3: fenshu(num ); break;
}
}
做出这道题大概花了2个小时233,不过等到它AC的那一刻真的是超 级 爽!
加油^0^~