前两天刷题刷到这样一道题目,然后问了大佬这种解法的思路,才恍然大悟...
题意:
给一个长度不超过 18 的 01 串,你需要输出这个串在 2, 3, 4, 5, 6, 7, 8, 9, 10 进制表示下的数值在 10 进制下的和。
输入描述:
第一行是一个正整数 T (T<=100000),表示测试数据的组数,
接下来 T 行,每行包含一个长度不超过 18 的 01 串,保证没有前导零。
输出描述:
对于每组测试数据,输出一个整数。
示例1
输入
2
10
101
输出
54
393
当时我在想第一个样例字串是10,那它十进制数就是2咯,那三、四、五....九进制数不都是2嘛,但是2*9=18,根本不是54,哈哈哈哈当场笑喷!!!再细读题意,在K进制下表示下的数值,比如10在三进制表示的值为0*3^0+1*3^1=3,在四进制表示的值为0*4^0+1*4^1.写出来谁都会,但是写成程序就一脸懵逼,我在想它干脆让我写个进制转换器出来得了。
我也是后来才发现的规律,我们可以发现,这个01串在K进制表示的值都是从这个串(命名str)的最后一位开始进行计算,然后往前取数再进行计算,然后K(这里假设是三进制)开始发生变化,第一个肯定1,因为任何数0次幂是1,接着就是3^1=3,再接着就是3^2=9,也就是3*3,这里需要拿一个变量来记录进制数本身的变化,先上一波代码~
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+7;
const long long mod=1e9+7;
LL str,sum;
int T;
LL Binary(int i)
{
LL num=str,m=1,ans=0;
while(num!=0)
{
ans+=num%10*m;
m=m*i;
num=num/10;
}
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%lld",&str);
for(int i=2;i<=10;i++)
sum+=Binary(i);
printf("%lld\n",sum);
}
return 0;
}
问了某佬才懂咋写的,重点是写出Binary这个函数,某佬先问我1001在K进制下表示的值,我就说是k^0*1+k^1*0+k^2*0+k^3*1,但是还是不会(人笨就是这样~),接着大佬说str%10就可以取出最后一位,拿个变量m来表示k的几次方的值就可以了。
规律:str%10可以取出这个01串的最后一位(前提是01串),然后用str/10来去掉最后一位,再判断str是不是为0,假如为0就说明已经操作完。
举栗子举栗子:str=1001吧,1001%10=1,1也就是最后一位咯,然后初始化m=1,k^0*1=m*1=1*1就可以得出第一步,接着用1001/10=100,就把最后一位1去掉了,按照这样的规律,到最后一步1/10=0,就会不满足条件,无法进入循环,直接把它累加的值return一下即可。
不过嘿嘿,没错,又有一个函数,那就是strtol()函数,它的原型:long int strtol (const char* str, char** endptr, int base);
作用将一个字符串转换为长整型long,这个说多没意思,直接上网搜就好。
Code:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+7;
const long long mod=1e9+7;
int T;
LL sum;
char str[20];
int main()
{
scanf("%d",&T);
while(T--)
{
sum=0;
scanf("%s",str);
for(int i=2;i<=10;i++)
sum+=strtol(str,NULL,i);
printf("%lld\n",sum);
}
return 0;
}
看了一下平台记录 :
方案 | 运行时间(ms) | 使用内存(KB) |
---|---|---|
方案一 | 87 | 2064 |
方案二 | 138 | 2148 |
调用函数虽然说简洁一些,但是时间上还是有一定差距的~
原文:https://www.cnblogs.com/K2MnO4/p/12248131.html