关于时间复杂度

在竞赛中,一般算机一秒能运行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;
}

 



 

上一篇:10.5模拟赛


下一篇:9.29模拟赛