题目描述
对于一个整数 n,存在一种操作:将 n 对一个不大于 n 的正整数 mod 取余(1≤mod≤n),并将结果再赋值给 n。(即:n=n%mod)
请问 n 变为 0 最多需要多少次操作?
输入描述:
第一行给定一个整数 T(1≤T≤10^5),下面为 T 组数据,每行给定一个整数 n(0≤n≤10^18)。
输出描述:
输出 T 行,每行一个整数。示例1
输入
3 0 3 114514输出
0 2 16原题链接:登录—专业IT笔试面试备考平台_牛客网
题解和思路:
#include<iostream>
using namespace std;
//要使操作最多,则需要尽力保留n,即使a%b尽可能大
//那么取a%(a/2+1)能使结果为(a/2)-1,尽可能的保留了近一半大小
//为什么b取(a/2)+1,因为a>b>(a/2)+1会减少存留,同样a/2>b>0也会使保留变小
int main (){
long long n,cnt;
int a;
cin>>a;
while(a--){
cnt=0;
cin>>n;
while(n){
n=n%(n/2+1);
cnt++;
}cout<<cnt<<endl;
}
return 0;
}