#include <bits/stdc++.h> using namespace std; long long n, k, cnt = 0, sum = 0; long long gcd(long long a,long long b) { long long r; while(b>0) { r=a%b; a=b; b=r; } return a; } void dfs(long long x) { if (x >n) { if (sum > k) cnt++; } else { for (int i = 10; i >0; i--) { sum+=i; dfs(x +1); sum-=i; } } } int main() { long long wtf=1; cin>>n>>k; dfs(1); for(int i=1; i<=n; i++) { wtf*=10; } if(cnt == 0) { cout << "0" << endl; } else if(cnt == wtf) { cout << "1" << endl; } else { long long g=gcd(cnt, wtf); cout << cnt / g << "/" << wtf/ g << endl; } return 0;优化此代码 }
时间: 2024-01-21 20:05:01 浏览: 22
这段代码是一道数学题的代码,但是看起来有些冗长。可以考虑对其进行优化,具体来说有以下几个方面可以改进:
1. 函数参数传递方式
在这段代码中,函数dfs的参数是通过传值的方式进行的,这样会导致在递归调用中频繁进行值的拷贝,影响程序的效率。可以考虑将其改为传引用的方式,如下:
```
void dfs(long long x, long long& sum, long long& cnt) {
if (x > n) {
if (sum > k)
cnt++;
} else {
for (int i = 10; i > 0; i--) {
sum += i;
dfs(x + 1, sum, cnt);
sum -= i;
}
}
}
```
2. 避免全局变量
在这段代码中,有多个全局变量,这样会导致程序的可读性和可维护性变差。可以考虑将其改为局部变量,如下:
```
int main() {
long long n, k;
cin >> n >> k;
long long cnt = 0, sum = 0;
dfs(1, sum, cnt);
long long wtf = 1;
for (int i = 1; i <= n; i++) {
wtf *= 10;
}
if (cnt == 0) {
cout << "0" << endl;
} else if (cnt == wtf) {
cout << "1" << endl;
} else {
long long g = gcd(cnt, wtf);
cout << cnt / g << "/" << wtf / g << endl;
}
return 0;
}
```
3. 使用位运算代替乘除法
在这段代码中,有多处使用了乘除法,这样会影响程序的效率。可以考虑使用位运算进行替换,如下:
```
int main() {
long long n, k;
cin >> n >> k;
long long cnt = 0, sum = 0;
dfs(1, sum, cnt);
long long wtf = (1LL << n);
if (cnt == 0) {
cout << "0" << endl;
} else if (cnt == wtf) {
cout << "1" << endl;
} else {
long long g = gcd(cnt, wtf);
cout << cnt / g << "/" << wtf / g << endl;
}
return 0;
}
```
4. 其他优化
还有一些其他的优化,比如可以将循环中的常量10改为变量,这样可以提高代码的可读性和灵活性;可以使用inline关键字对一些简单的函数进行内联,提高程序的效率等等。
综上所述,优化后的代码如下: