1. 拼多多笔试题 循环小数的开始位置和循环节
解析:
模拟长除法的计算过程。
①mod = a%b;
②小数 = (mod*10) / b;
③mod = (mod*10)%b;
循环②③步,当出现重复的余数的时候,也就是循环节出现了
- 也可以使用一个map<int,int> 组成(余数,余数的第几位),方便查找!
- 此题不需要记录余数是什么。
#include<iostream> #include<vector> using namespace std; int main() { vector<int>a; int n,m; while(~scanf("%d %d",&n,&m)) { a.clear(); int t = n%m; a.push_back(t); bool ok = false; while(t) { t = t * 10 % m; for(int i = 0; i < a.size(); i++) { if(a[i] == t) { ok = true; cout<<i<<' '<<a.size()-i<<endl; break; } } if(ok) break; a.push_back(t); } if(t == 0&&!ok) cout<<a.size()-1<<' '<<0<<endl; } return 0; }
2. 快手笔试
-
编程实现表示循环小数,例如将1/3表示为0.(3)就是将循环节放在括号中
- 思路和上一题类似,注意一些边界条件
- 发现这是一道leetcode原题,艹,当时都没有发现;
"""第一题""" tmp = input().split() numerator = int(tmp[0]) denominator = int(tmp[1]) def fractionToDecimal(numerator, denominator): if numerator == 0: return '0' res = '' if numerator * denominator < 0: res += '-' numerator, denominator = abs(numerator), abs(denominator) res += str(numerator // denominator) if numerator % denominator == 0: return res res += '.' r = numerator % denominator m = {} # print(res) while r: if r in m: res = res[:m[r]] + '(' + res[m[r]:] + ')' break m[r] = len(res) r *= 10 res += str(r // denominator) r %= denominator return res res = fractionToDecimal(numerator, denominator) # print(res) if '(' not in res: if '.' not in res: print(int(res)) else: print(res) else: print(res)
- https://github.com/apachecn/awesome-leetcode/blob/master/src/kuaishou.md
class Solution { public: string fractionToDecimal(int numerator, int denominator) { if(numerator==0) return "0"; string result; if(numerator<0 ^ denominator<0 ) result+='-'; //异或,numerator<0和denominator<0仅有一个为真 //转化为正数,INT_MIN转化为正数会溢出,故用long long。long long int n=abs(INT_MIN)得到的n仍然是负的,所以写成下面的形式。 long long int n=numerator,d=denominator; n=abs(n);d=abs(d); result+=to_string(n/d); //整数部分 long long int r=n%d; //余数r if(r==0) return result; else result+='.'; //下面处理小数部分,用哈希表 unordered_map<int,int> map; while(r){ //检查余数r是否在哈希表中,是的话则开始循环了 if(map.find(r)!=map.end()){ result.insert(map[r],1,'('); //http://www.cplusplus.com/reference/string/basic_string/insert/ result+=')'; break; } map[r]=result.size(); //这个余数对应于result的哪个位置 //正常运算 r*=10; result+=to_string(r/d); r=r%d; } return result; } };