算法-Skew数

算法-Skew数

关键字一

关键字二

  • 题目

    • 描述
    • 输入
    • 输出
    • 样例输入
    • 样例输出
    • 来源
  • 解题思路
    • 关键点
    • 完整代码

题目

描述

在 skew binary表示中, 第 k 位的值xk表示xk*(2^(k+1)-1)。 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) = 1*(2^5-1) + 0*(2^4-1) + 1*(2^3-1) + 2*(2^2-1) + 0*(2^1-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew数是 0、1、2、10、11、12、20、100、101、以及102。

输入

输入包含一行或多行,每行包含一个整数n。 如果 n = 0 表示输入结束,否则n是一个skew 数

输出

对于每一个输入,输出它的十进制表示。转换成十进制后, n 不超过 2^31-1 = 2147483647

样例输入

10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0

样例输出

44
2147483646
3
2147483647
4
7
1041110737

来源

http://bailian.openjudge.cn/practice/2973

解题思路

关键点

题目实际上是一个转换问题,可以封装成一个函数,我的做法是用字符串来保存输入,然后从最后一位开始计算,从而得到输出。函数声明如下:

int calc(char *num);

其实现如下:

int calc(char *num){
    int sum = 0;
    int base = 2;
    int n = strlen(num);
    for (int i = n; i > 0; i--) {
        int a = num[i-1] - '0';
        a *= (base-1);
        sum += a;

        base *= 2;
    }

    return sum;
}

具体的转化思路可参考我的另外一篇文章算法-确定进制

完整代码

该题比较简单,完整代码如下:

//
//  main.cpp
//  2973:Skew数
//
//  Created by limao on 15/6/11.
//  Copyright (c) 2015年 limao. All rights reserved.
//
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int calc(char *num){
    int sum = 0;
    int base = 2;
    int n = strlen(num);
    for (int i = n; i > 0; i--) {
        int a = num[i-1] - '0';
        a *= (base-1);
        sum += a;

        base *= 2;
    }

    return sum;
}

int main(int argc, const char * argv[]) {
    char num[35];
    while( scanf("%s",num) && num[0] != '0' ){
        //进行输出
        printf("%d\n",calc(num));
    }

    return 0;
}
时间: 2024-12-28 23:32:01

算法-Skew数的相关文章

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

Bailian2973 Skew数【进制】

2973:Skew数 总时间限制: 1000ms 内存限制: 65536kB 描述 在 skew binary表示中, 第 k 位的值xk表示xk(2k+1-1). 每个位上的可能数字是0 或 1,最后面一个非零位可以是2, 例如, 10120(skew) = 1(25-1) + 0(24-1) + 1(23-1) + 2(22-1) + 0(21-1) = 31 + 0 + 7 + 6 + 0 = 44. 前十个skew数是 0.1.2.10.11.12.20.100.101.以及102. 输

算法训练 数对

时间限制:1.0s   内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行,即一个整数. 输出格式:输出有若干行,每一行是一个乘法式子.(注意:运算符号与数字之间有一个空格)输入输出样例 样例输入 32 样例输出 1 * 32 = 322 * 16 = 324 * 8 = 328 * 4 = 3216 * 2 = 3232 * 1 = 32 import java.util.Scanner; publi

编程算法 - 分割数 代码(C)

分割数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个无差别的物品, 将它们划分成不超过m组, 求出划分方法数模M的余数. 比如: n=4的m=3个划分, result=4(1,1,2; 1,3; 2,2; 4) 使用动态规划(DP)方法, n的m划分a, 假设每一个i都有a, {a-1}的集合就是n-m的m划分; a=0时, 就是n的m-1划分. 递推公式: dp[i][j] = dp[i][j-i] + dp[i-1][j] 代

贪心算法----删数问题

一.问题描述 给定n位整数a,去掉其中任意k<=n个数字后,剩下的数字按原次序排列组成一个新的正整数.如输入一个正整数:178543:删除其中4个数得到:13 二.解决思路--贪婪算法 这里先介绍之前错误的思路: 找出数字中n-k个最小的数,组成新的正整数: 但是很快就有问题出现,虽然每次都找的是整数各个位置中最小的数,但是忽略掉了位置的相对关系,如以下的例子: 输入的一个整数:178906: 6位数的整数 删除其中4个数: 按照这个思路,即要选择6-4=2个最小的数,即0 和1,按照数中原有的

51Nod一级算法1002数塔取数问题

---恢复内容开始--- 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define max(x,y) ((x)>(y)?(x):(y)) 4 int main(){ 5 int n; 6 int i,j,k; 7 scanf("%d",&n);//层数 8 k = (n+1)*n/2;//所有节点总数 9 int *a = (int*) malloc(sizeof(int) * k);//动态数组,记录每

算法 - Catalan数 (卡特兰)

http://blog.csdn.net/linhuanmars/article/details/24761459 https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%A1%94%E5%85%B0%E6%95%B0 Cn表示长度2n的dyck word的个数.Dyck word是一个有n个X和n个Y组成的字串,且所有的前缀字串皆满足X的个数大于等于Y的个数. Cn的另一个表达形式为 所以,Cn是一个自然数:这一点在先前的通项公式中并不显而易见.这个表达形式也是A

算法63----丑数【动态规划】

一.题目: 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数. 说明:  1 是丑数. n 不超过1690. 思路:动态规划 t1,t2,t3三个变量记录乘以2,3,5的个数.如: 代码: def nthUglyNumber(self, n): """ :type n: int :rtype: int &qu

算法:数对

题目: 牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了. 但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k. 牛牛希望你能帮他计算一共有多少个可能的数对. 算法分析: 首先判断y在[k+1, n]的范围内,对0-n的数字进行分组: [0,1,2....y-1], [y,y+2,....,2y-1]......[n*y,...n] 一共有n//y组数据,前面n//y-1组数据每组有n个数,其中前面k个数除以y的余数小于k,所以每组有(y-k)