• 蓝桥杯 数列 进制


    问题描述
      给定一个正整数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 }
  • 相关阅读:
    SDN第一次上机作业
    期末作业验收
    SDN第5次上机作业
    个人作业——软件工程实践总结作业
    SDN第4次上机作业
    SDN第四次作业
    SDN第三次上机作业
    SDN第三次作业
    SDN第二次上机作业
    SDN第二次作业
  • 原文地址:https://www.cnblogs.com/fx1998/p/12698100.html
Copyright © 2020-2023  润新知