UVa 202 大数除法

来源:互联网 发布:杜兰特首秀数据 编辑:程序博客网 时间:2024/05/22 00:30

背景:1_WA:忘了每个答案之间有一个空白行!2_WA:没看见等号左右两边都有空格!!!!!!!!

思路:整数和小数分开来求,整数部分直接用整型除法,小数部分:分子=(分子%分母)*10.并且把每个分子储存在str[0]中,当出现已经出现过的分子时,小数部分开始循环!

学习:

1.巢鸽原理(抽屉原理,狄利克雷原则):

 简单的描述:如果有n个笼子,n+1只鸽子居住,则至少有一个笼子有两只鸽子。

一般化的描述(用高斯函数来叙述):将n个元素分到m个集合中,至少有一个集合中元素个数大于等于[(n-1)/m]+1 。

对于本题,a%b最多有b-1个情况,根据巢鸽原理,循环节数小于等于b-1.

#include<stdio.h>int str[2][10000];  int main(void){  int a,b,intger;  while(scanf("%d %d",&a,&b)!=EOF){  int count=0,start,aa=a;  intger=a/b;  a=a%b;  while(1){  a*=10;  for(int i=0;i < count;i++){  if(a==str[0][i]){  start=i;            goto l1;  }  }  str[0][count]=a;  str[1][count++]=a/b;  a=a%b;  }l1:   printf("%d/%d = %d.",aa,b,intger);      for(int i=0;i < start;i++){      printf("%d",str[1][i]);      }             if(count<=50){      printf("(");      for(int i=start;i < count;i++){      printf("%d",str[1][i]);      }      printf(")\n");      }else{      printf("(");      for(int i=start;i < start+50;i++){      printf("%d",str[1][i]);      }      printf("...)\n");      }      printf("   %d = number of digits in repeating cycle\n\n",count-start);  }  return 0;} 


0 0