输入一个带除法运算的字符串,输出运算结果。其中,除不尽的,如果有循环小数,要用括号标识循环体。
例如:输入:8/5 输出:1.6(而不是1.6000...)
输入:1/3 输出:.(3)(而不是0.333...)输入:11/13 输出:.(846153)
#include <stdio.h>
#include <string.h>
#define mn 1000
static int divisor=0,dividend=0;
static int p[mn],q[mn];
static int i,r,t;
void getnum(int a,int b){/*a是除数,b是被除数*/
for(i=0;i<mn;i++) //给数组p初始化值全为-1
{
p[i]=-1;
q[i]=0;
}
t=0; //初始化值
r=b%a; //把被除数取余赋给r
while(r!=0&&(p[r]==-1)) //循环条件当r不为0且p[r]=-1时执行循环体
{
p[r]=t; //余数r第一次出现的位置
r=10*r; //把被除数扩大10倍,以至于取第一个小数
t++;
q[t]=r/a; //计算小数点后t位的值:取整,即为b/a的小数从小数点开始逐个取出放到数组q中
r=r%a; //算完一位就去掉一位,即取余对n
}
}
void char2num(char a[]){/*用于将字符串转换为相应的除数和被除数*/
int len=strlen(a);
int i;
for (i=0; i<=len; i++) {
if (a[i]=='/') {
break;
}
dividend=dividend*10+a[i]-'0';
}
for (i=i+1; i<len; i++) {
divisor=divisor*10+a[i]-'0';
}
}
int main(){
char a[32];
gets(a);
char2num(a);
getnum(divisor, dividend);
int num_zheng;
num_zheng=dividend/divisor;
if (num_zheng>0)
printf("%d.",num_zheng);
else printf(".");
if (r!=0) //被除数不为0就执行以下语句
{
for(i=1;i<=p[r];i++) //输出循环小数中前面非循环的部分
printf("%d",q[i]);
printf("("); //输出循环的小数放在括号中
for(i=p[r]+1;i<=t;i++)
printf("%d",q[i]);
printf(")");
}
else //被除数为0的情况
for(i=1;i<=t;i++) //输出不循环的小数
printf("%d",q[i]);
printf("\n");
}