首页 > 试题广场 >

skew数

[编程题]skew数
  • 热度指数:23916 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
在 skew binary 表示中,第 k 位的值 x[k] 表示 x[k]×(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。

输入描述:
输入包括多组数据,每组数据包含一个 skew 数。


输出描述:
对应每一组数据,输出相应的十进制形式。结果不超过 2^31-1。
示例1

输入

10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000

输出

44
2147483646
3
2147483647
4
7
1041110737
代码写的很凌乱。一开始是比较低等的取余算每个位。不知为何到了一定的位数就乱了。估计是类型的长度问题。看了下大家的代码才发现原来可以存在字符串里面。也怪自己菜。

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *str;
str = (char*)malloc(sizeof(char)*35);
  int  i;
  int  tmp;
    while(scanf("%s",str)!=EOF){
    for(i=0;str[i]!='\0';i++){
    }
    int  count = 0;
      int value = 0;
        while(i>0){
            i--;
            tmp = 2<<count;
            value = value + (str[i]-'0')*(tmp-1);
            count++;
        }
         printf("%d\n",value);
    }
    return 0;
}
发表于 2015-08-13 16:01:14 回复(0)
应该是最短c++了吧
#include <iostream>
#include <cmath>
using namespace std;
int main(){
    string s;
    while(cin>>s){
        int sum = 0;
        for(int i = s.length()-1,j = 0;i >=0;i--,j++){
            sum += (s[i]-'0')*(pow(2,j+1)-1);
        }
        cout<<sum<<endl;
    }
    return 0;
}

发表于 2019-03-04 16:25:32 回复(4)

python两行解法

使用lambda表达式以达到装逼的效果。

map接收三个参数,第一个是lambda表达式,后面两个分别是对应x和y的数组

while True:
    try:
        number = input()
        print(sum(map(lambda x, y: int(y) * (2 ** x - 1), range(len(number), 0, -1), list(number))))
    except:
        break
编辑于 2018-04-01 09:48:42 回复(0)
L0L头像 L0L
#include<iostream>
#include<string>
using namespace std;
int fun(const string &s){
	int ret=0;
	int v,b;
	for(int i=0;i<s.size();i++){
		v=s[i]-'0';
		b=s.size()-i;
		ret+=v*((1<<b)-1);
	}
	return ret;
}
int main(){
	string s;
	while(cin>>s){
		cout<<fun(s)<<endl;
	}
	return 0;
}


发表于 2015-11-20 14:43:38 回复(0)
#include<stdio.h>
#include<string.h>
int main (){//the shorter,the better.
    int i,len,c,n;char str[64];
    for(;fgets(str,64,stdin)!=NULL;printf("%d\n",n))
        for(n=i=0,len=strlen(str)-1;i<len&&str[i]!='\n';n+=(str[i]-'0')*((1<<len-i)-1),i++);
}

发表于 2018-02-03 13:36:22 回复(0)
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
    string str;
    while (cin >> str) {
        int skew = 0;
        for (int i = 0, j = str.size(); i < str.size(); i++, j--) {
            skew += (str[i] - '0') * (pow(2, j) - 1);
        }
        cout << skew << endl;
    }
    return 0;
}

发表于 2024-01-31 13:04:45 回复(0)
#include<stdio.h>
int main()
{
    char a[100];int i,sum;
    while(gets(a)!=NULL)
    {
        sum=0;
        for(i=0;a[i]!='\0';i++)
            sum+=(a[i]-'0')*(pow(2,strlen(a)-i)-1);
        printf("%d\n",sum);
    }
}


编辑于 2020-04-27 13:44:08 回复(2)
//shew 数
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int shew(int m,int x)
{
    if(x==0){
        return 0;
    }
    else {
        //cout<<x<<endl;
        return x*(pow(2,m)-1);
    }
 } 
 
 int main()
 {
     string s;
     while(cin>>s)
     {
         int L=s.size();
         int sum=0;
         for(int i=0;i<s.size();i++){
             sum+=shew(L,s[i]-'0');
             L--;
         }
         cout<<sum<<endl;
     }
     return 0;
 }

编辑于 2019-03-31 12:10:14 回复(0)
#include<iostream>
#include<string>
#include<math.h>
using namespace std;

int main(){
    string input;
    long ans;
    int len;

    while(cin >> input) {
        ans = 0;
        len = input.size();

        for(int i = 0; i < len; i ++) {
            if(input[i] != '0')
                ans += (input[i] - '0') * (pow(2, len - i) - 1);
        }

        cout << ans << endl;
    }
}

发表于 2019-02-11 21:40:53 回复(0)
# include<stdio.h>
# include<string.h>
# include<math.h>

int skew(char str[])
{
    int len=strlen(str);
    int i;
    int sum=0;
    for(i=0;i<len;i++)
    {
        int num=str[i]-'0';
        sum=sum+num*(pow(2,len-i)-1);
    }
    return sum;
}

int main()
{
    char str[200];
    while(scanf("%s",str)!=EOF)
    {
        printf("%d\n",skew(str));
    }
    return 0;
}

发表于 2018-07-23 17:14:56 回复(0)
importjava.util.Arrays;
importjava.util.Comparator;
importjava.util.Scanner;
 
publicclassMain {
    publicstaticvoidmain(String[] args) {
        Scanner in = newScanner(System.in);
 
        while(in.hasNext()) {
            String x = in.next();
            System.out.println(compute(x));
        }
    }
 
    publicstaticintcompute(String x) {
        intans = 0;
        intratio = 2;
        for(inti = x.length()-1; i >= 0; i--) {
            intnum = x.charAt(i) - '0';
            ans += num * (ratio - 1);
            ratio <<= 1;
        }
 
        returnans;
    }
}

发表于 2016-01-17 20:55:23 回复(0)
#include <iostream>
#include<string>
using namespace std;

int main() {
    string str;
    int sum,r;
    while(cin>>str){
        sum=0;
        r=2;//基数
        for(int i=str.size()-1;i>=0;--i){
            sum+= (str[i]-'0')*(r-1);//套公式
            r*=2;//每次乘以2
        }
        cout<<sum<<endl;
    }

    return 0;
}

编辑于 2024-03-25 22:37:36 回复(0)
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main(){
    string str;     //字符串存大数
    while(cin >> str ){
        int k=str.size();
        int res=0;
        for(int i=0; i<str.size(); ++i){
            res+=(str[i]-'0')*(pow(2,k)-1);     //善用-'a'或'0'
            --k;
        }
        cout << res << endl;
    }
}

发表于 2024-02-29 01:52:52 回复(1)
#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
    string str;
    while (cin>>str) { 
        long long sum=0;
        int size = str.size();
        for (int i=0; i<size; i++) {
            sum += (str[i]-'0')*(pow(2, size-i)-1);
        }
        cout<<sum<<endl;
    }
}

发表于 2023-03-15 21:20:50 回复(0)
#include <stdio.h>
#include <math.h>
#include <string.h>
int main() {
    int skew, sum, i, t, len;
    char skew_s[32];
    while(scanf("%s", skew_s) != EOF){
        len = strlen(skew_s);
        i = 1;
        sum = 0;
        for(int j = len - 1; j >= 0; j--)
            sum += (skew_s[j] - '0') * (pow(2, i++) - 1);
        printf("%d\n", sum);
    }//直接用数值不行,会变成-1
    return 0;
}

发表于 2023-03-09 21:06:40 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main(){
    string str;
    while(cin>>str){
        int number=0;
        for(int i=0;i<str.size();i++){
            number+=(str[i]-'0')*(pow(2,str.size()-i)-1);
        }
        cout<<number<<endl;
    }
    return 0;
}
发表于 2022-10-03 19:27:36 回复(1)
#include<iostream>
#include<cmath>
#include<string>
using namespace std;

int main(){
	string str;
	while(cin >> str){
		int sum = 0;
		for(int i = str.size(), j = 0; j < str.size(); --i, ++j){
			if(str[j] != '0')
				sum += (str[j] - '0')*( pow( (float)2, (float)i) - 1);//(float)2导致结果出错,溢出
		}
		cout << sum << endl;
	}
	return 0;

}
哪位老铁能够解答下,pow函数中如果 pow( (float)2, (float)i) - 1,结果会出现错误,我试了下原因在于常数2前加了强制类型装换,如果去掉(float)就正确了,谢谢大神指教
发表于 2022-02-25 22:16:41 回复(3)
为啥我本地运行OK,到了提交测试结果就一堆奇怪的数字啊.....迷茫
#include<bits/stdc++.h>
using namespace std;
int mySkew(string n);
int main(){
	string n;
	int re;
	while(cin>>n){
		re = mySkew(n);
		cout<<re<<endl;
	}

	return 0;
} 

int mySkew(string n){
	int re;
	int i;
	for(i=0;i<n.length();++i){
		re += (n[i]-'0')*(pow(2,n.length()-i)-1);
	}
	return re;
}



发表于 2021-10-01 20:12:30 回复(0)
Java 解法
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String s = scanner.nextLine();
            int sum=0;
            for (int i = 0,len=s.length(); i < len ; i++) {
                sum+= (s.charAt(i)-'0')*(Math.pow(2,len-i)-1);
            }
            System.out.println(sum);
        }
    }
}


发表于 2020-03-07 21:41:50 回复(0)
while True:
    try:
        print(sum([int(digit) * (2 ** (index + 1) - 1) for index, digit in enumerate(input()[::-1])]))
    except:
        break;
看到前面有人装*用两行,我决定也装个*,一行实现😄
发表于 2020-03-07 11:01:40 回复(1)