NOIP1998PJ
刷这三道题耗费了我足足20分钟的时间,
说实话递归这个东西是有点难搞的
将共个数分成组,分别组成个三位数,且使这个三位数构成的比例,试求出所有满足条件的个三位数。
木有输入
若干行,每行个数字。按照每行第个数字升序排列。
暴力枚举,当然也可以手模输出答案)
#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;
}
用高精度计算出
其中“!”表示阶乘,例如:。
一个整数。
一个正整数,表示计算结果。
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.
任何一个正整数都可以用的幂次方表示。例如:
同时约定方次用括号来表示,即可表示为。由此可知,可表示为:
进一步: (用表示)
所以最后可表示为:
又如:
所以最后可表示为:
一个正整数。
符合约定的的表示(在表示中不能有空格)
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
真是耗费时间和精力的好办法

浙公网安备 33010602011771号