zoukankan      html  css  js  c++  java
  • 20201022 day42 模拟(十四)

    1 自然数的拆分

    problem

    给定(n),将其拆分成至少2个至多(n)个自然数相加,以字典序从小到大输出。

    solution

    朴素dfs。

    code

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int n,a[110];
    int read(){
    	int a=0,op=1;char c;c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')op=-1;c=getchar();}
    	while(c>='0'&&c<='9'){a*=10,a+=c^48,c=getchar();}
    	return a*op;	
    }
    
    void print(int len)
    {
    	for (int i=1;i<len-1;i++)
    	printf("%d+",a[i]);
    	printf("%d",a[len-1]);
    	printf("
    ");
    }
    void dfs(int pos,int left,int now)
    {
    	if (left==0 && pos>2) print(pos);
    	if (now>left) return;
    	for (int i=now;i<=left;i++)
    	a[pos]=i,dfs(pos+1,left-i,i);
    }
    int main()
    {
    freopen("decompose.in","r",stdin);freopen("decompose.out","w",stdout);
    	n=read();
    	dfs(1,n,1);
    	return 0;
    } 
    

    2 进制转换

    problem

    我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 (10) 为底数的幂之和的形式。
    例如 (123) 可表示为 (1 imes 10^2+2 imes 10^1+3 imes 10^0) 这样的形式。
    与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以 (2) 为底数的幂之和的形式。 一般说来,任何一个正整数 (R) 或一个负整数 (-R) 都可以被选来作为一个数制系统的基数。如果是以 (R)(-R) 为基数,则需要用到的数码为 (0,1,....R-1)
    例如当 (R=7) 时,所需用到的数码是 (0,1,2,3,4,5,6),这与其是 (R)(-R) 无关。如果作为基数的数绝对值超过 (10),则为了表示这些数码,通常使用英文字母来表示那些大于 (9) 的数码。
    例如对 (16) 进制数来说,用 (A) 表示 (10),用 (B) 表示 (11),用 (C) 表示 (12),以此类推。 在负进制数中是用 $-R $ 作为基数,例如 (-15)(十进制)相当于 (110001)(-2)进制),并且它可以被表示为 (2) 的幂级数的和数: $$110001=1 imes (-2)^5+1 imes (-2)^4+0 imes (-2)^3+0 imes (-2)^2+0 imes (-2)^1 +1 imes (-2)^0$$ 设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数。

    输入样例 #1

    30000 -2
    

    输出样例 #1

    30000=11011010101110000(base-2)
    

    输入样例 #2

    -20000 -2
    

    输出样例 #2

    -20000=1111011000100000(base-2)
    

    【数据范围】 对于 (100\%) 的数据,(-20 le R le -2)(|n| le 37336)
    NOIp2000提高组第一题

    solution

    和正进制一样,每次取的余数保证在0m-1之间。(例如m=-16,则余数应该在015)就可以直接输出。
    所以用系统的“%”运算符的时候必须注意检查是不是在该范围(可能在m+1~0),否则就调整。
    调整的方法是:如果余数<0,那么:余数-=m;商++;

    code

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <stack>
    using namespace std;
    const int maxn=1e5+10;
    int read(){
    	int a=0,op=1;char c;c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')op=-1;c=getchar();}
    	while(c>='0'&&c<='9'){a*=10,a+=c^48,c=getchar();}
    	return a*op;	
    }
    int n,r;
    char js[]="0123456789ABCDEFGHIJ";
    stack<int>s;
    int main()
    {
        freopen("t1.in","r",stdin);freopen("t1.out","w",stdout);
    	n=read(),r=read();
        printf("%d=",n);
        while(n){
            int a=n%r;
            n/=r;
            if(a<0) {a-=r;n++;}//如果余数为负数,余数减去进制数,商加1
            s.push(a);
        }
        while(!s.empty()){
            printf("%c",js[s.top()]);
            s.pop();
        }
        printf("(base%d)
    ",r);
        return 0;
    }
    
  • 相关阅读:
    pandas缺失值处理之——如何消去Nan值对数字型字符串数据类型的影响,让数字型字符串保持原始str类型,而不会自动变为float类型?
    pandas基础操作
    pandas基础操作一
    Selenium — 点击被页面上其他元素遮住的控件
    Selenium中,若HTML元素输入框带有readonly属性,如何实现修改其元素内容
    Newman + Jenkins 实现postman持续集成
    on java 8 第十四章 流式编程
    on java 8 第十三章 函数式编程
    Thinking in java Chapter20 annotations
    Thinking in java Chapter21 并发
  • 原文地址:https://www.cnblogs.com/liuziwen0224/p/20201022day42-001.html
Copyright © 2011-2022 走看看