首页 > 试题广场 >

Skew数

[编程题]Skew数
  • 热度指数:5902 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
在 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。

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


输出描述:
可能有多组测试数据,对于每一个输入,
输出它的十进制表示。转换成十进制后的结果不超过 2^31-1 = 2147483647
示例1

输入

10120
200000000000000000000000000000
10
1000000000000000000000000000000
11
100
11111000001110000101101102000
0

输出

44
2147483646
3
2147483647
4
7
1041110737
#include<iostream>
#include<cmath>
 
usingnamespacestd;
 
intmain(){
    string num;
    while(cin >> num){
        if(num == "0") break;
        intn = num.size(), sum = 0;
        for(inti = 0; i < n; i ++){
            if(num[i] != '0')
                sum += (num[i] - '0') * (pow(2, n - i) - 1);
        }
        cout << sum << endl;
    }
}
发表于 2021-08-14 10:11:08 回复(0)
#include<stdio.h>
(737)#include<string.h>
int main()
{
    char a[100];  int i,n,sum;
    while(scanf("%s",a)!=EOF)
    {
        if(a[0]=='0'&&a[1]=='\0') break;
        n=strlen(a);sum=0;
        for(i=0;i<strlen(a);i++)//字符数组的下标
            sum+=(a[i]-'0')*(pow(2,n--)-1);
        printf("%d\n",sum);
    }    
}

发表于 2020-04-01 21:36:46 回复(0)
题目xk*(2k+1-1)中的2k表示的是2的k次方。。。。还以为是2k连接成一个数

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    string str;
    while(cin>>str && str!="0"){
        int i=str.size()-1;
        int sum=0;
        while(i>=0){
            string s="";    s+=str[i];
            int m=stoi(s);
            if(m>0)
                sum+=m*(pow(2,(str.size()-i))-1);
            --i;
        }
        cout<<sum<<endl;
    }
    return 0;
}
发表于 2019-03-23 10:23:49 回复(0)
#include<bits/stdc++.h>
char a[33];
int main(){
    while(gets(a)){
        int sum=0;
        for(int i=0;i<strlen(a);i++)
            sum=sum+(a[i]-'0')*(pow(2,strlen(a)-i)-1);
        printf("%d\n",sum);
    }
}
发表于 2019-03-12 16:57:24 回复(0)
这题还是 比较简单的,就是可能会在开头为0的数那里少考虑情况,所以对非零的数进行计数即可,如果非零数大于零,则不退出,否则说明为0,需要退出
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int main() {
    char ch[32];
    while(cin >> ch){
        int count=0;
        for (int i = 0; i < strlen(ch)/2; i++) {
            char temp = ch[i];
            ch[i] = ch[strlen(ch) - 1 - i];
            ch[strlen(ch) - 1 - i] = temp;
            if(ch[i]!=0)
                count++;
        }
        if(count==0)
            break;
        int a[32];
        int total = 0;
        for (int i = 0; i < strlen(ch); i++)
            total += (pow(2, i + 1) - 1)*(ch[i] - '0');
        cout << total << endl;
    }
}

发表于 2019-02-08 15:34:48 回复(1)
try:
    while True:
        num = input()
        if num == '0':break
        numLen = len(num)
        result = 0
        for i in range(numLen):
            result += int(num[i])*(2**(numLen-i)-1)
            if num[i] == '2':
                break
        print(result)
except Exception:
    pass
编辑于 2018-10-04 11:06:43 回复(0)

python三行解法

使用了lambda表达式,以使代码看起来比较高深一些。

map里面有三个参数,第一个是lambda表达式,后面对应x,y的数组。

while True:
    try:
        number = input()
        if number != "0":
            print(sum(map(lambda x, y: int(y) * (2 ** x - 1), range(len(number), 0, -1), list(number))))
    except:
        break
编辑于 2018-04-01 09:45:37 回复(0)
//看不懂题目,可以看这里:(本蒟蒻无力吐槽)
在 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。
发表于 2018-09-06 19:30:30 回复(4)
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
	long long  n;
	while(cin >> n)
	{ 
		int sum=0, i=1, t;
		while(n)
		{
			t = n % 10;
			sum += t*(pow(2, i)-1);
			n /= 10;
			i++;
		}
		cout << sum << endl;
	}
	return 0;
}

编辑于 2021-02-14 11:04:25 回复(0)
#include <stdio.h>
#include "string.h"
#include "math.h"
int main() {
    char n[1000];
    while ((scanf("%s",&n)!=EOF)&&strcmp(n,"0") != 0) {
        int len = strlen(n),sum = 0;

        for (int i = 0; i<len; i++) {
            sum = sum + (n[i]-'A' + 17)*(pow(2,len - i)-1);
            //printf("sum = %d,n[i] = %d,pow(2,len - i)-1 = %d\n",sum,n[i]-'A'+20,pow(2,len - i)-1);
        }
        printf("%d\n",sum);
    }
    return 0;
}
编辑于 2024-03-21 13:49:56 回复(0)
def skew(n):
    s = 0
    i=0
    while n:
        i += 1
        t = n % 10
        n = n // 10
        s += t * (2**i-1)
    return s

while True:
    try:
        n = int(input())
        if n == 0:
            break
        print(skew(n))
    except:
        break

编辑于 2024-03-18 22:36:18 回复(0)
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main(){
    int binary[31];
    for(int i=0; i<31; ++i){
        binary[i]=pow(2, i+1)-1;
    }
    string str;
    while(cin >> str && str != "0"){
        int res = 0;
        for(int i=str.size()-1, k=0; i>=0; --i, ++k){
            res += (str[i] - '0') * binary[k];
        }
        cout << res << endl;
    }
}

编辑于 2024-03-10 19:57:52 回复(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 17:13:47 回复(1)
//其实看到有多组测试,题目却又没说输入某个数字时退出时,从这就能知道用字符串存储了
#include "stdio.h"
#include "string"
#include "math.h"
using namespace std;

int main(){
    char buf[1000];string str;
    while (fgets(buf,1000,stdin)!=NULL) {
        str = buf;int sum = 0;
        str.pop_back();
        for(int i=0;i<str.size();++i){
            if(str[i] != '0')
            ++sum;
        }
        if(sum == 0)
        break;
        sum = 0;
        for (int i = 0; i<str.size(); ++i) {
            sum += (buf[i]-'0')*(pow(2,str.size()-i)-1);
            buf[i] = '\0';
        }
        printf("%d\n",sum);
        str.clear();
    }
}
发表于 2023-03-09 08:46:03 回复(0)
#include <bits/stdc++.h>
using namespace std;

string skew;

int main()
{
    while (cin >> skew)
    {
        if (skew == "0")
            break;
        int sum = 0;
        for (int i = 0; i < skew.length(); i++)
            sum += (pow(2, skew.length() - i) - 1) * (skew[i] - '0');
        cout << sum << endl;
    }

    return 0;
}

发表于 2022-07-26 15:01:09 回复(0)
#include<iostream>
#include<cmath>
using namespace std;

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


发表于 2022-03-03 23:44:53 回复(0)
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>

using namespace std;

int main(){
    string str;
    while(cin>>str){
        if(str == "0") break;
        int len = str.size();
        int index = 0;
        int ans = 0;
        while(index < len){
            ans += (str[index] - '0') * (pow(2, len - index) - 1);
            index++;
        }
        cout<<ans<<endl;
    }
    return 0;
}
发表于 2022-03-02 14:28:32 回复(0)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

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

发表于 2022-01-31 18:36:33 回复(0)
# include <iostream>
# include <string>
# include <cmath>

using namespace std;

int main()
{
    string str;
    while(cin>>str)
    {
        int skew=0;
        for(int i=0;i<str.size();i++)
        {
            skew+=(str[i]-'0')*(pow(2,str.size()-i)-1);
        }
        cout<<skew<<endl;
    }
    return 0;
 } 
发表于 2022-01-26 18:50:02 回复(0)
#include<iostream>
#include<cmath>
#include<string>
using namespace std;

int main(){
	string s;
	while(getline(cin,s)){
		if(s=="0")
			break;
		else{
			double n=0;
			for(int i=0;i<s.length();i++)
				n+=(s[s.length()-i-1]-48)*(pow(double(2),int(i+1))-1);
			printf("%.0f",n);
			printf("\n");
		}
	}
}

发表于 2022-01-18 11:57:17 回复(0)

问题信息

难度:
39条回答 5776浏览

热门推荐

通过挑战的用户

查看代码