一个算法题解
写一个函数,接受两个参数N,D进行分数运算N/D;N表示分子,D表示分母。
输入带小数的结果;对于循环小数,用()把循环部分括起来,比如1/3 表示为0.(3)。
限制输出小数点后100位数字,并仅考虑循环在100前结束。
现在给一个算法,基本思路是按照小学所学的除法运算,检查商和余数是否有重复来判断循环小数。此解花费约20分钟完成编码,30分钟调试完成。
输入带小数的结果;对于循环小数,用()把循环部分括起来,比如1/3 表示为0.(3)。
限制输出小数点后100位数字,并仅考虑循环在100前结束。
现在给一个算法,基本思路是按照小学所学的除法运算,检查商和余数是否有重复来判断循环小数。此解花费约20分钟完成编码,30分钟调试完成。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
void fraction(int N, int D, int size, char* out)
{
char result[102] = {0};
int a = N / D;
int aa = a;
int b = N - a*D;
int check_a[102];
memset(check_a,0,102*sizeof(int));
int check_b[102];
memset(check_b,0,102*sizeof(int));
int i = 0;
int c = 10 * b;
while(b!=0 && i < 100)
{
a = c / D;
b = c - a*D;
check_a[i] = a;
check_b[i] = b;
c = 10*b;
bool loop = false;
int loopBegin = 0;
for (int j=0;j<i;j++)
{
if (check_a[j] == a && check_b[j] == b)
{
loop = true;
loopBegin = j;
break;
}
}
if (loop)
{
memmove(result+loopBegin+1, result+loopBegin, i-j);
result[loopBegin] = '(';
result[loopBegin+i-j+1] = ')';
break;
}
else
{
sprintf(result,"%s%d",result,a);
}
i++;
}
char* big = out;
memset(big,0,size);
itoa(aa,big,10);
strcat(big,".");
strcat(big,result);
}
int main(int argc,char** argv)
{
if (argc!=3)
{
printf("input N D\n");
return -1;
}
int N = atoi(argv[1]);
int D = atoi(argv[2]);
char result[120] = {0};
fraction(N,D,sizeof(result),result);
printf(result);
return 0;
}
#include <memory.h>
#include <stdlib.h>
#include <string.h>
void fraction(int N, int D, int size, char* out)
{
char result[102] = {0};
int a = N / D;
int aa = a;
int b = N - a*D;
int check_a[102];
memset(check_a,0,102*sizeof(int));
int check_b[102];
memset(check_b,0,102*sizeof(int));
int i = 0;
int c = 10 * b;
while(b!=0 && i < 100)
{
a = c / D;
b = c - a*D;
check_a[i] = a;
check_b[i] = b;
c = 10*b;
bool loop = false;
int loopBegin = 0;
for (int j=0;j<i;j++)
{
if (check_a[j] == a && check_b[j] == b)
{
loop = true;
loopBegin = j;
break;
}
}
if (loop)
{
memmove(result+loopBegin+1, result+loopBegin, i-j);
result[loopBegin] = '(';
result[loopBegin+i-j+1] = ')';
break;
}
else
{
sprintf(result,"%s%d",result,a);
}
i++;
}
char* big = out;
memset(big,0,size);
itoa(aa,big,10);
strcat(big,".");
strcat(big,result);
}
int main(int argc,char** argv)
{
if (argc!=3)
{
printf("input N D\n");
return -1;
}
int N = atoi(argv[1]);
int D = atoi(argv[2]);
char result[120] = {0};
fraction(N,D,sizeof(result),result);
printf(result);
return 0;
}