zoukankan      html  css  js  c++  java
  • 蓝桥杯 数列 进制

    问题描述
      给定一个正整数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 }
  • 相关阅读:
    leetcode-788-Rotated Digits(使用vector替代if else的逐个判断)
    leetcode-771-Jewels and Stones(建立哈希表,降低时间复杂度)
    leetcode-766-Toeplitz Matrix(每一条对角线元素的比较)
    leetcode-762-Prime Number of Set Bits in Binary Representation
    leetcode-747-Largest Number At Least Twice of Others(求vector的最大值和次大值)
    Flink中逻辑计划和物理计划的概念划分和对应关系
    Java线程池中线程的生命周期
    在ServletFilter层返回多字段提示给前端
    JavaBIO利用装饰器模式来组织和扩展接口
    SparkShuffle机制
  • 原文地址:https://www.cnblogs.com/fx1998/p/12698100.html
Copyright © 2011-2022 走看看