实时搜索: pascal 输入几个数字

pascal 输入几个数字

356条评论 3514人喜欢 4766次阅读 545人点赞
用数组,排序与分类的作业。
input
输入文件只有一行,一‘?’借宿的一串字符。
output
输出文件共十行,没行输出俩证书,分别是数字和该数字在字符串中出现的次数多少,按降序排列,期间用一个空格隔开。
输入样例
a28455529A9B9c9762z66ob648y88u85c788805o9?
输出样例
8 8
5 5
9 5
6 4
2 3
4 2
7 2
0 1
1 0
3 0 , 如 输入样例:749
输出样例:169...

pascal键盘输入m,n,再输入n个正整数,从n个数中选若干个和为m,几种选法: 01背包问题。。
状态转移方程为f(i)=sum{f(i-a[j])},f(i)表示为加起来为i时有几种选法,sum是求和,a(j)表示第j个树。最后输出f(m)即可,如果看不懂的话请去学习背包问题

Pascal输入一串字符,以?结束,分别统计其中数字(0,1,2,....9)出现的次数: 程序很简单,仔细看吧:
var
a:array ['0'..'9'] of longint;
b:array ['0'..'9'] of char;
c,i,j,tt:char;
t:longint;
begin
//初始化
for i:='0' to '9' do
b[i]:=i;
//读取字符
read(c);
while c<>'?' do
begin
if (c>='0')and(c<='9') then
inc(a[c]);
read(c);
end;
//冒泡排序
for i:='0' to '8' do
for j:=chr(ord(i)+1) to '9' do
if a[i]<a[j] then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
tt:=b[i];
b[i]:=b[j];
b[j]:=tt;
end;
//输出统计结果
for i:='0' to '9' do
writeln(b[i],' ',a[i]);
end.

求助:::用PASCAL输入一个正整数,然后与它倒过来的数相加输出: var st:string;
i,sum:longint;
begin
readln(st);
for i:=1 to length(st) do sum:=sum*10+ord(st[i])-48+ord(st[length(st)-i+1])-48;
writeln(sum);
end.
刚才不小心写错了

(用PASCAL语言)求两个整数的最小公倍数,输入整数a,b,输出a,b的最小公倍数(全过程): var
a, b: Integer;//两个整数
res: Integer;//最小公倍数
begin
Readln(a);//读取第一个整数
Readln(b);//读取第二个整数
res := b;//认为最小公倍数的起始值为b
if a > b then
res := a;//如果a>b, 那么最小公倍数起始值为a
repeat
Inc(res);//res递加
until (res mod a = 0) and (res mod b = 0);//是最小公倍数就退出
Writeln(res);//输出最小公倍数
Readln;
end.//附上运行截图

pascal 数据类型: 在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字.
一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开放等运算.
譬如一个很大的数字N >= 10^ 100, 很显然这样的数字无法在计算机中正常存储.
于是, 我们想到了办法,将这个数字拆开,拆成一位一位的 或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字.这样这个数字就被称谓是高精度数.
对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法:
下面提供了Pascal的高精度加法, 高精度乘以单精度, 高精度乘以高精度的代码, 其他版本请各位大牛添加进来吧!
Pascal代码如下(非完整); k为预定进制,加大进制以提高速度。
Procedure HPule(a, b: Arr; Var c:Arr); //高精度加法
Var
i: Integer;
Begin
FillChar(c, SizeOf(c), 0);
For i:= 1 To Maxn-1 Do Begin
c〔i〕:= c〔i〕 + a〔i〕 + b〔i〕;
c〔i + 1〕 := c〔i〕 Div k;
c〔i〕 := c〔i〕 Mod k;
End;
End;
Procedure HPule(a: Arr; b:Integer; Var c:Arr); //高精度乘以单精度
Var
i: Integer;
Begin
FillChar(c, SizeOf(c), 0);
For i:= 1 To Maxn-1 Do Begin
c〔i〕 := c〔i〕 + a〔i〕 * b;
c〔i+1〕:= c〔i〕 Div k;
c〔i〕:= c〔i〕 Mod k
End;
End;
Procedure HPule(a, b: Arr; ; Var c:Arr); //高精度乘以高精度
Var
i, j: Integer;
Begin
FillChar(c, SizeOf(c), 0);
For i:= 1 To Maxn Do
For j := 1 To Maxn Begin
c〔i+j-1〕 := c〔i+j-1〕 + a〔i〕 * b〔j〕;
c〔i+j〕:= c〔i+j-1〕 Div k;
c〔i+j-1〕:= c〔i+j-1〕 Mod k
End;
End;
Ps:为了防止百度错误识别, 过程中有不少符号是全角状态输入.
高精度加法
var
a,b,c:array[1..201] of 0..9;
n:string;
lena,lenb,lenc,i,x:integer;
begin
write('Input augend:'); readln(n);lena:=length(n);
for i:=1 to lena do a[lena-i+1]:=ord(n)-ord('0');{加数放入a数组}
write('Input addend:'); readln(n); lenb:=length(n);
for i:=1 to lenb do b[lenb-i+1]:=ord(n)-ord('0');{被加数放入b数组}
i:=1;
while (i<=lena) or(i<=lenb) do
begin
x := a + b + x div 10; {两数相加,然后加前次进位}
c := x mod 10; {保存第i位的值}
i := i + 1
end;
if x>=10 {处理最高进位}
then begin lenc:=i; c:=1 end
else lenc:=i-1;
for i:=lenc downto 1 do write(c); writeln {输出结果}
end.
高精度乘法(低对高)
const max=100; n=20;
var a:array[1..max]of 0..9;
i,j,k;x:integer;
begin
k:=1; a[k]:=1;{a=1}
for i:=2 to n do{a*2*3….*n}
begin
x:=0;{进位初始化}
for j:=1 do k do{a=a*i}
begin
x:=x+a[j]*i; a[j]:=x mod 10;x:=x div 10
end;
while x>0 do {处理最高位的进位}
begin
k:=k+1;a[k]:=x mod 10;x:=x div 10
end
end;
writeln;
for i:=k dowento 1 write(a){输出a}
end.
高精度乘法(高对高)
var a,b,c:array[1..200] of 0..9;
n1,n2:string; lena,lenb,lenc,i,j,x:integer;
begin
write('Input multiplier:'); readln(n1);
write('Input multiplicand:'); readln(n2);
lena:=length(n1); lenb:=length(n2);
for i:=1 to lena do a[lena-i+1]:=ord(n1)-ord('0');
for i:=1 to lenb do b[lenb-i+1]:=ord(n2)-ord('0');
for i:=1 to lena do
begin
x:=0;
for j:=1 to lenb do{对乘数的每一位进行处理}
begin
x := a*b[j]+x div 10+c;{当前乘积+上次乘积进位+原数}
c:=x mod 10;
end;
c:= x div 10;{进位}
end;
lenc:=i+j;
while (c[lenc]=0) and (lenc>1) do dec(lenc); {最高位的0不输出}
for i:=lenc downto 1 do write(c); writeln
end.
高精度除法
fillchar(s,sizeof(s),0);{小数部分初始化}
fillchar(posi,sizeof(posi),0); {小数值的位序列初始化}
len←0;st←0; {小数部分的指针和循环节的首指针初始化}
read(x,y);{读被除数和除数}
write(x div y);{输出整数部分}
x←x mod y;{计算x除以y的余数}
if x=0 then exit;{若x除尽y,则成功退出}
while len<limit do{若小数位未达到上限,则循环}
begin
inc(len);posi[x]←len;{记下当前位小数,计算下一位小数和余数}
x←x*10; s[len]←x div y;x←x mod y;
if posi[x]<>0 {若下一位余数先前出现过,则先前出现的位置为循环节的开始}
then begin st←posi[x]; break;end;{then}
if x=0 then break; {若除尽,则成功退出}
end;{while}
if len=0
then begin writeln;exit;end;{若小数部分的位数为0,则成功退出;否则输出小数点}
write('.');
if st=0 {若无循环节,则输出小数部分,否则输出循环节前的小数和循环节}
then for i←1 to len do write(s)
else begin
for i←1 to st-1 do write(s);
write('(');
for i←st to len do write(s);
write(')');
end;{else}

所谓的高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个200位的数的和。这时,就要用到高精度算法了。在这里,我们首先讨论高精度加法。
[编辑本段]高精度加法
高精度运算主要解决以下三个问题:
一、加数、减数、运算结果的输入和存储
运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。在Pascal中,能表示多个数的数据类型有两种:数组和字符串。
数组:每个数组元素存储1位(在优化时,这里是一个重点!),有多少位就需要多少个数组元素;用数组表示数的优点:每一位都是数的形式,可以直接加减;运算时非常方便。用数组表示数的缺点:数组不能直接输入;输入时每两位数之间必须有分隔符,不符合数值的输入习惯;
字符串:String型字符串的最大长度是255,可以表示255位。Ansistring型字符串长度不受限制。用字符串表示数的优点:能直接输入输出,输入时,每两位数之间不必分隔符,符合数值的输入习惯;用字符串表示数的缺点:字符串中的每一位是一个字符,不能直接进行运算,必须先将它转化为数值再进行运算;运算时非常不方便;
综合以上所述,对上面两种数据结构取长补短:用字符串读入数据,用数组存储数据:
var st:string;
x,y:array[0..255]of integer;{定义两个数组,X和Y,用来储存数}
i,j,l1,l2:integer;
begin
readln(st);
l1:=length(st);{------length(x),该函数是获取字符串X的长度,返回为整型}
for i:=0 to 255 do x[i]:=0;{数组初始化}
for i:=l1 downto 1 do
x[l1-i+1]:=ord(st[i])-ord('0');{------这里是重点,把字符串转换为数值,储存在数组中}
readln(st);
l2:=length(st);{------length(x),该函数是获取字符串X的长度,返回为整型}
for i:=0 to 255 do y[i]:=0;{数组初始化}
for i:=l2 downto 1 do
y[l2-i+1]:=ord(st[i])-ord('0');{------这里是重点,把字符串转换为数值,储存在数组中}
对字符串转为数值原理补充:ord(x)-48,如果X='1',因为'1'的ASCLL码是49,所以减去48就等于1,间接地把字符转换为数值了,各位初手要好好体会.
二、运算过程
在往下看之前,大家先列竖式计算35+86。
注意的问题:
(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;
(2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助MOD、DIV运算完成这一步;
(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;
(4)如果两个加数位数不一样多,则按位数多的一个进行计算;
if l1<l2 then l1:=l2;
for i:=1 to l1 do
begin
x[i]:=x[i]+y[i];
x[i+1]:=x[i+1]+x[i] div 10;
x[i]:=x[i] mod 10;
end;
三、结果的输出(这也是优化的一个重点)
按运算结果的实际位数输出
var st:string;
x,y:array[0..255]of integer;
i,j,l1,l2:integer;
begin
readln(st);
l1:=length(st);
for i:=0 to 255 do x[i]:=0;
for i:=l1 downto 1 do
x[l1-i+1]:=ord(st[i])-ord('0');
readln(st);
l2:=length(st);
for i:=0 to 255 do y[i]:=0;
for i:=l2 downto 1 do
y[l2-i+1]:=ord(st[i])-ord('0');
if l1<l2 then l1:=l2;
for i:=1 to l1 do
begin
x[i]:=x[i]+y[i];
x[i+1]:=x[i+1]+x[i] div 10;
x[i]:=x[i] mod 10;
end;
write('x+y=');
j:=255;
while x[j]=0 do j:=j-1;
for i:=j downto 1 do write(x[i]);
readln;
end.
四、优化:
以上的方法的有明显的缺点:
(1)浪费空间:一个整型变量(-32768~32767)只存放一位(0~9);
(2)浪费时间:一次加减只处理一位;
针对以上问题,我们做如下优化:一个数组元素存放四位数;(integer的最大范围是32767,5位的话可能导致出界)将标准数组改为紧缩数组。第一步的具体方法:
l:=length(s1);
k1:=260;
repeat {————有关字符串的知识}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
而因为这个改进,算法要相应改变:
(1)运算时:不再逢十进位,而是逢万进位(mod 10000; div 10000);
(2)输出时:最高位直接输出,其余各位,要判断是否足够4位,不足部分要补0;例如:1,23,2345这样三段的数,输出时,应该是100232345而不是1232345。
改进后的算法:
program sum;
var s1,s2,s:string;
a,b,c:packed array [1..260] of integer;
i,l,k1,k2,code:integer;
begin
write('input s1:');readln(s1);
write('input s2:');readln(s2);
l:=length(s1);
k1:=260;
repeat {————有关字符串的知识}
s:=copy(s1,l-3,4);
val(s,a[k1],code);
k1:=k1-1;
s1:=copy(s1,1,l-4);
l:=l-4;
until l<=0;
k1:=k1+1;
l:=length(s2);
k2:=260;
repeat
s:=copy(s2,l-3,4);
val(s,b[k2],code);
k2:=k2-1;
s2:=copy(s2,1,l-4);
l:=l-4;
until l<=0;
k2:=k2+1;
if k1<k2 then k:=k1 else k:=k2;
y:=0;
for i:=260 downto k do
begin
x:=a+b+y;
c:=x mod 10000;
y:=x div 10000;
end;
if y<>0 then begin k:=k-1;c[k]:=y;end;
write(c[k]);
for i:=k+1 to 260 do
begin
if c<1000 then write('0');
if c<100 then write('0');
if c<10 then write('0');
write(c);
end;
writeln;
end.

pascal输入一个4位数,将它的各位数字倒序输出: 说了用 div和mod来做;
那就是
var
a,b,c,d,e:longint;
begin
readln(a); // (读入)
b:=a div 1000; // (拆分,取第一位);
c:=a div 100 mod 10;// (拆分,取第二位);
d:=a div 10 mod 10; //(拆分,取第三位);
e:=a mod 10; // (拆分,取四位);
write(e,d,c,b); // (输出);
end.

pascal 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。: var
i,n:longint;
first:boolean;
begin
readln(n);
first:=true;
write(n,'=');
if n<=1 then write(n);
for i:=2 to trunc(sqrt(n)) do begin
if n=1 then break;//n=1表示已经分解完毕
while n mod i=0 do begin
if not first then write('*');
first:=false;
write(i);
n:=n div i;
end;
end;
if n<>1 then write(n);//如果n是质数的话,要特殊判断一下。
writeln;
end.

pascal问题:输入n个整数的数列,请找出数列中最小数所在的位置。求大师解答一下。。: var a:array[1..1000]of integer; n,i,j,t:integer;
begin
readln(n); j:=1;
for i:=1 to n do
begin
read(a[i]);
if a[i]<a[j] then j:=i;
end;
writeln('Min at ',j,' is ',a[j]);
writeln('After swap:');
t:=a[1]; a[1]:=a[j]; a[j]:=t;
for i:=1 to n do
write(a[i],' ');
writeln;
end.

  • 2014美国现任总统是谁

    期货行情软件都有哪些?: 期货行情软件主要包括:博易大师、掌上财务、文华财经。这些软件都可以通过银河期货官网“软件专区”下载到,安装和使用都很简单。 ...

    496条评论 5144人喜欢 1101次阅读 984人点赞
  • dnf有哪些加智力的宝珠

    who sent it to still others.中的still怎么理解?词性是什么?: 你老师是对的。有also的意思,但是可以不翻译出来。still another (或者others)还有另一个(或者其他)常在3个(种)以上 的人物时使用这里 friend,relative,others第二天,亚当...

    207条评论 6030人喜欢 6050次阅读 583人点赞
  • oppor9s换屏幕多少钱

    Welcome back.中 back是什么词性 back 前为什么不加to: back是副词,表示回来。例如: I am back. ...

    367条评论 5193人喜欢 6150次阅读 574人点赞
  • foot什么意思

    tp-link340g和741n改的ubnt哪个要好点?想求一个: 340效果还是可以的 改UBNT后散热大,又是夏天到了 要考虑做好散热740的发热要好点 54M的满速也就2M多,总的来说还是落后些了 ...

    586条评论 6290人喜欢 3294次阅读 763人点赞
  • nba最高球员是谁

    美剧《lie to me》可以在哪里下载?: 电脑的话 百度“美剧天堂”迅雷看看就可以在线 手机的话 我可以给你百度云链接 ...

    362条评论 2341人喜欢 5962次阅读 382人点赞
  • ps3 ps4 买哪个好

    电脑P图软件都有哪些!?: PhotoShop美图秀秀光影魔术手可牛影像常用的这些都是。 ...

    505条评论 4558人喜欢 5949次阅读 545人点赞