在竞赛中,一般算机一秒能运行5 x 10^8次汁算,如果题目給出的时间限制カ1s,那么你选择的算法执行的汁算次数最多应该在10^8量级オ有可能解决这个题目。一般 O(n)的算法能解决的数据范围在n < 10^8。
O(n *logn)的算法能解决的数据范围在n <= 10^6。
O(n*sqrt(n) )的算法能解决的数据范围在n < 10^5。
O(n^2)的算法能解决的数据范围在n<5000。
O(n^3)的算法能解决的数据范围在n <300。
O(2^n)的算法能解决的数据范围在n < 25。
O(n!)的算法能解决的数据范围在n < 11。
以上范围仅供参考,实际中还要考虑每种算法的常数。
读入优化“:由于cin和scanf效率不高,利用getchar()手写一个读入数字的函数可以使程序运行时间变短,这在读入量很大时尤其明显,甚至可能使程序由超时变通过。
getchar函数的作用是一次读入一个字符,当然它也会将数字之间的空格或回车读入,若读入数字的函数还没有读到数字,我们应将这些字符过滤。若函数已经读入了数字,那么这些字符就代表一个数字已经读完了,应结束读取。
int read(){ char c=getchar(); while(c<'0'||c>'9'){//过滤无用字符 c=getchar(); } int num=c^48;//读入数字时,c^48等效于c-'0',c^48效率似乎"稍微"高一点 c=getchar(); while(c>='0'&&c<='9'){//如果读入了其他字符,就跳出循环 num=num*10+(c^48); //当读入新的字符,那么之前的数字整体向高位移动一位,即之前的数乘10+新数字 //例如,之前已经读入了123,新读入一个数字4,那么数字应为1230+4=1234 c=getchar(); } return num; }
而且这个函数经过修改就可以读入任意进制, 将(新读入的数字)改为(进制)+(新读入的数字)即可。
题目描述
请你编写一个程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制,第二行是一个n进制数,若则用大写字母表示数码,并且该进制数对应的十进制的值不超过,第三行也是一个正整数,表示转换之后的数的进制。
输出格式
一个正整数,表示转换之后的进制数。
样例输入
16
FF
2
样例输出
11111111
数据规模与限定
时间限制:1 s
内存限制:64 M
#include<iostream> using namespace std; int cti(char a){//字符转数字 if(a>='A'){ return a-'A'+10; } return a-'0'; } char itc(int a){//数字转字符 if(a>=10){ return 'A'+a-10; } return a+'0'; } int main(){ long long i,n=0,p1,p2,x=1; string s,res=""; cin>>p1>>s>>p2; for(i=s.size()-1;i>=0;i--){ n+=cti(s[i])*x; x*=p1; } while(n!=0){ res=itc(n%p2)+res; n/=p2; } cout<<res<<endl; return 0; }