蓝桥杯 数列 进制

问题描述
  给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
  1,3,4,9,10,12,13,…
  (该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…)
  请你求出这个序列的第N项的值(用10进制数表示)。
  例如,对于k=3,N=100,正确答案应该是981。
输入格式
  只有1行,为2个正整数,用一个空格隔开:
  k N
  (k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
输出格式
  计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
样例输入
3 100
样例输出
981
参考自https://blog.csdn.net/qq_42837885/article/details/83719463
先看上面这篇题解,然后再往下看。
看题目的意思,在所有的测试数据中,结果均不超过2.1*10^9,开int足够了。
然而我想着既然马上就要溢出了,那不如开一个long long放心了。
但是在蓝桥杯官网的练习系统提交测评时,这是一道开了long long 防溢出反而会错误的题目。
这是开了long long得90分的代码(满分100)
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[20];
 4 int main() {
 5     int k, n;
 6     cin >> k >> n;
 7     int len = 0;
 8     while (n) {
 9         a[len++] = n % 2;
10         n /= 2;
11     }
12     long long ans = 0; //看这里 
13     long long t = 1; //看这里 
14     for (int i = 0; i < len; i++) {
15         ans += a[i] * t;
16         t *= k;
17     } 
18     cout << ans << endl; 
19     return 0;
20 }

 这是第10个样例的输入和输出

在这个测试样例中,十进制的600,转换为二进制为1001011000,然后我们把1001011000当作一个13进制的数,然后输出这个数的10进制就是答案。

这是我开了long long 输出中间变量进行调试的的代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[20];
 4 int main() {
 5     int k, n;
 6     cin >> k >> n;
 7     int len = 0;
 8     while (n) {
 9         a[len++] = n % 2;
10         n /= 2;
11     }
12     for (int i = len - 1; i >= 0; i--) {
13         cout << a[i];
14     }
15     cout << endl;
16     long long ans = 0;
17     long long t = 1;
18     for (int i = 0; i < len; i++) {
19         ans += a[i] * t;
20         cout << ans << " ";
21         t *= k;
22         cout << t << endl;
23     } 
24     cout << ans << endl; 
25     return 0;
26 }

输出结果:

 然后这是按照题意只开int进行调试的代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[20];
 4 int main() {
 5     int k, n;
 6     cin >> k >> n;
 7     int len = 0;
 8     while (n) {
 9         a[len++] = n % 2;
10         n /= 2;
11     }
12     for (int i = len - 1; i >= 0; i--) {
13         cout << a[i];
14     }
15     cout << endl;
16     int ans = 0;
17     int t = 1;
18     for (int i = 0; i < len; i++) {
19         ans += a[i] * t;
20         cout << ans << " ";
21         t *= k;
22         cout << t << endl;
23     } 
24     cout << ans << endl; 
25     return 0;
26 }

输出结果:

 然后明白了,这道题本来的答案用int是存不下的,开int一定会溢出的。题目就是让你只开int输出溢出后的结果。

研究一下还是挺有意思的。

AC代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[20];
 4 int main() {
 5     int k, n;
 6     cin >> k >> n;
 7     int len = 0;
 8     while (n) {
 9         a[len++] = n % 2;
10         n /= 2;
11     }
12     int ans = 0;
13     int t = 1;
14     for (int i = 0; i < len; i++) {
15         ans += a[i] * t;
16         t *= k;
17     } 
18     cout << ans << endl; 
19     return 0;
20 }

猜你喜欢

转载自www.cnblogs.com/fx1998/p/12698100.html