法1:

使用long long这种类型,是存不下输入的大整数的

所以以下的程序,虽然逻辑上是正确的,但是实际上会出错

#include <stdio.h>

long power(long a,long b)//a^b
{
    long M=a;
    while(--b)
        M*=a;
    return M;
}

int main()
{
    long long Num=0;
    long long tmp=0;
    while(scanf("%d",&Num)!=EOF)
    {
        long i=0,Sum=0;
        tmp=Num%10;
        Num/=10;
        while(Num)
        {
            Sum+=(tmp*(power(2,i+1)-1));
            i++;
            tmp=Num%10;
            Num/=10;
        }
        Sum+=(tmp*(power(2,i+1)-1));
        printf("%d\n",Sum);
    }
    return 0;
}

法2:

正确的做法是将超大整数当成字符串来处理

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 25

int main()
{
    char BigInt[MAX]={0};
    while(scanf("%s",BigInt)!=EOF)
    {
        int Sum=0;
        int L=strlen(BigInt);
        for(int i=1;i<=L;i++)
        {
            Sum+=((BigInt[i-1]-'0')*(pow(2,L-i+1)-1));
        }
        printf("%d\n",Sum);
    }
    
    return 0;
}