给定了一个新的转换为二进制的方法。
我们从个位数往后从1开始进行标记序号。 即个位序号为1,十位序号为2,百位序号为3 。如果某一位的序号和这一位上的数奇偶性相同。我们就认为二进制上这一位为1,否则即为0。
比如给你一个数 1322653 。
那么其序号和转化为二进制的情况。
1 | 3 | 2 | 2 | 6 | 5 | 3 | |
序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
二进制 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
那么我们用题目给出的方法将其转换为二进制即为 1001001。
但是你需要把这个二进制的数再转换为十进制并打印这个十进制的数。
输入格式
多组输入
每组给出一个数字。 数字长度为 1~10^6
输出格式
输出其通过题目给出方法转换为二进制再转换成十进制的数。
因为结果会超过long long int 的数据范围。 所以结果对 1000000007 取模。
即如果答案为 1000000008 ,因为1000000008%1000000007=1,所以我们输出 1 。
代码如下:
#include<string.h>
#include<stdio.h>
char c[1000000]; //数字长度较大,需要在主函数外面定义长度。
int a[1000000],n;
int main()
{
while(~scanf("%s",c)){
long long sum=0,i,t=strlen(c)-1;
for(i=t;i>=0;i--){
a[t-i]=c[i]-'0';
}
for(i=0;i<t+1;i++){ //根据题意转换好二进制。
if((i+1)%2!=a[i]%2)a[i]=0;
else a[i]=1;
}
for(i=0,n=1;i<=t;i++){ //转成十进制,从个位数开始转换,否则数太大时不好处理。乘以对应的2的几次方。
sum+=a[i]*n; //sum就是十进制的结果,还要取余。
sum%=1000000007; //由于结果要取余,如果在加完每个数后都取余,结果不变但是能处理大数。
n=(n*2)%1000000007; //同样,取余后结果不变但是能处理大数。
}
printf("%lld\n",sum);
}
return 0;
}
样例输入:
1322653 13226535645645456561231355615641685158416532486138 342315
样例输出:
73 796471120 13