NOIP1998PJ

刷这三道题耗费了我足足20分钟的时间,
说实话递归这个东西是有点难搞的\cdots\cdots

三连击
题目描述
1,2,,91,2, \cdots ,999个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。

输入格式
木有输入

输出格式
若干行,每行33个数字。按照每行第11个数字升序排列。

暴力枚举,当然也可以手模输出答案)

#include <bits/stdc++.h>
using namespace std;

int a,b,c,num[10];
bool flag;
int main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	for (register int a=123;a<=329;a++) {
		flag=1;
		b=a*2;c=a*3;
		num[1]=a/100;
		num[2]=(a/10) % 10;
		num[3]=a % 10;
		num[4]=b/100;
		num[5]=(b/10) % 10;
		num[6]=b % 10;
		num[7]=c/100;
		num[8]=(c/10) % 10;
		num[9]=c % 10;
		for (register int i=1;i<9;i++)
			for (register int j=i + 1;j<=9;j++) {
				if (num[i]==0 or num[j]==0 or num[i]==num[j]) {
					flag=0;
					break;
				}
			}
		if (flag) {
			cout<<a<<" "<<b<<" "<<c<<endl;
		}
	}
	
	return 0;
}

阶乘之和
题目描述
用高精度计算出S=1!+2!+3!++n!(n50)S=1!+2!+3!+…+n! (n≤50)

其中“!”表示阶乘,例如:5!=5×4×3×2×15!=5 \times 4 \times 3 \times 2 \times 1

输入格式
一个整数NN

输出格式
一个正整数SS,表示计算结果。

样例输入
3

样例输出
9

高精度乘法+高精度加法
就是一道模板题
虽然我打了好久)

Var a,t:array[1..3000] of longint;
    i,j,n,q,l,r,u,p,x:longint;
Begin
        readln(n);
        a[1]:=1;
        t[1]:=1;
        l:=1; r:=1;
        for i:=2 to n do
        Begin
                for j:=1 to l do a[j]:=a[j]*i;

                for j:=1 to l do
                Begin
                        a[j+1]:=a[j+1]+a[j] div 10;
                        a[j]:=a[j] mod 10;
                        while a[l+1]<>0 do
                        Begin
                                l:=l+1;
                                a[l+1]:=a[l+1]+a[l] div 10;
                                a[l]:=a[l] mod 10;
                        end;
                end;

                if l>p then u:=l
                else u:=p;
                x:=0;
                for j:=1 to u do
                Begin
                        t[j]:=t[j]+a[j]+x;
                        x:=t[j] div 10;
                        t[j]:=t[j] mod 10;
                end;

                if x>0 then
                Begin
                        t[j+1]:=x;
                        p:=j+1;
                end
                else
                Begin
                        p:=j;
                end;
        end;

        for i:=p downto 1 do
        Begin
                write(t[i]);
        end; 
end.

幂次方
题目描述
任何一个正整数都可以用22的幂次方表示。例如:
137=27+23+20137=2^7+2^3+2^0
同时约定方次用括号来表示,即aba^b可表示为a(b)a(b)。由此可知,137137可表示为:2(7)+2(3)+2(0)2(7)+2(3)+2(0)
进一步:7=22+2+207= 2^2+2+2^0212^122表示)3=2+203=2+2^0
所以最后137137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210+28+25+2+11315=2^{10}+2^8+2^5+2+1
所以13151315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
一个正整数n(n20000)n(n≤20000)

输出格式
符合约定的nn0,20,2表示(在表示中不能有空格)

样例输入
1315

样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

这个递归题虽然卡了本人许久
但是思路说来也简单
就是把读入的数换成二进制
一位一位地取出来运算

Var n,i:longint;
    a:array[0..14] of longint;

procedure dg(n:longint);
Var k,i,m:longint;
Begin
        m:=n;
        while n>0 do
        Begin
                for i:=14 downto 0 do
                Begin
                        if a[i]<=n then
                        Begin
                                k:=i;
                                break;
                        end;
                end;
                if n<m then write('+');
                n:=n-a[k];

                write(2);
                if k>2 then
                Begin
                        write('(');
                        dg(k);
                        write(')');
                end;
                if k=2 then write('(2)');
                if k=0 then write('(0)');
        end;
end;

Begin
        read(n);
        a[0]:=1;
        for i:=1 to 14 do
        Begin
                a[i]:=a[i-1]*2;
        end;

        dg(n);
end.

然后就没然后了呀
。。。
整体上很简单,就是有些细节容易出Bug
真是耗费时间和精力的好办法

posted @ 2020-01-15 15:25  willbe233  阅读(89)  评论(0)    收藏  举报