回 帖 发 新 帖 刷新版面

主题:大牛们,帮个忙啊

我有一道题,挺菜的,只过了6个数据,实在没法了.路过的好心人,帮个忙吧,先谢谢拉!


某国个人所得税法规定,普通公民的主要应纳税收入项目及纳税金额如下: 
工资、薪金所得。按月计算征税,以每月收入额减除费用800元后的余额作为该月应纳税所得额,税率如下表所示: 
级数  月应纳税所得额       税率(%)
1   (0,500]        5
2   (500,2000]     10
3   (2000,5000]    15
4   (5000,20000]   20
5   (20000,40000]  25
6   (40000,60000]  30
7   (60000,80000]  35
8   (80000,100000] 40
9   (100000,....)  45   

 
一次性劳动报酬所得。按次计算征税,每次不超过4000元的,减除费用800元;4000元以上的,减除20%的费用,余额为应纳税所得额。征税税率如下表所示: 
级数  每次应纳税所得额       税率(%)
1  (0,20000]      20
2  (20000,50000]  30
3  (50000,.....)  40

现在需要你编一程序,根据该国某公司的所有职员一年内的各项收入信息(收入项目、收入时间、收入金额)计算该公司所有职员这一年应交纳的个人所得税总额。 
Input 

输入文件的第一行为一个正整数M,表示该公司的职员总数(职员编号依次为1,2,…,M)。接下来的各行每行表示一年内某一个职员的一项收入信息。具体格式如下: 
工资、薪金收入信息:PAY 职员编号 收入时间 收入金额 
一次性劳务报酬收入信息:INCOME 职员编号 收入时间 收入金额 
其中,收入时间格式为:MM/DD,MM表示月份,DD表示日期;收入金额是一个正整数(单位:元),并假设每人每项收入金额小于100万元。 
输入文件以字符“#”表示结束。输入文件中同一行相邻两项之间用一个或多个空格隔开。 
Output 
输出文件只有一个正数P,保留两位小数。P表示该公司所有职员一年内应交纳的个人所得税总额(单位:元)

Sample Input 
2
PAY 1 2/23 3800 
INCOME 2 4/8 4010
INCOME 2 4/18 800
PAY 1 8/14 6700
PAY 1 8/10 1200
PAY 2 12/10 20000
#
Sample Output 
5476.60

以下是我的程序:
var ch:char;
    s,t:string;
    n,moth,d,i,j,k,l:longint;
    a:array[1..50000,1..12] of real;
    sum,mon,q:real;
begin
  readln(n); sum:=0;
  repeat
     s:=''; t:='';
     read(ch);
    if ch='#' then break;
    while ch<>' ' do begin s:=s+ch; read(ch); end;//S为收入信息:PAY或INCOME
    read(j); 
    while ch<>'/' do begin read(ch); t:=t+ch; end;//t为职员编号以后到'/'的字串;
    l:=length(t);
    if t[l-1]=' ' then val(copy(t,l-1,1),moth)
      else val(copy(t,l-2,2),moth);  //取出月份
    readln(d,mon);
    if s='PAY' then a[j,moth]:=a[j,moth]+mon;
    if s='INCOME' then
     begin
      if mon<=4000 then
      begin
       mon:=mon-800;
       if mon>0 then
       if mon<=20000 then sum:=sum+mon*0.2 else
       if mon<=50000 then sum:=sum+4000+(mon-20000)*0.3 else
       sum:=sum+13000+(mon-50000)*0.4;
      end else
      begin
        mon:=mon*0.8;
        if mon<=20000 then sum:=sum+mon*0.2 else
        if mon<=50000 then sum:=sum+20000*0.2+(mon-20000)*0.3 else
        sum:=sum+20000*0.2+30000*0.3+(mon-50000)*0.4;
      end;
     end;  //一次性收入的税
  until false; 
  for i:=1 to n do
   for j:=1 to 12 do
    begin 
      a[i,j]:=a[i,j]-800;
      if a[i,j]>0 then
      if a[i,j]<=500 then sum:=sum+a[i,j]*0.05 else
      if a[i,j]<=2000 then sum:=sum+25+(a[i,j]-500)*0.1 else
      if a[i,j]<=5000 then sum:=sum+175+(a[i,j]-2000)*0.15 else
      if a[i,j]<=20000 then sum:=sum+625+(a[i,j]-5000)*0.2 else
      if a[i,j]<=40000 then sum:=sum+3625+(a[i,j]-20000)*0.25 else
      if a[i,j]<=60000 then sum:=sum+8625+(a[i,j]-40000)*0.3 else
      if a[i,j]<=80000 then sum:=sum+14625+(a[i,j]-60000)*0.35 else
      if a[i,j]<=100000 then sum:=sum+21625+(a[i,j]-80000)*0.4 else
       sum:=sum+29625+(mon-100000)*0.45;
    end;  //按月交的税
  writeln(sum:0:2);
end.
 

谢谢啊!!





回复列表 (共2个回复)

沙发

这是我写的一个程序,能不能把测试数据发上来:
  const
    MaxM=100;
  var
    Pay:array [1..maxm,1..12] of longint;
    Income:real;
    m:byte;
  procedure inputdate;
    var
      s:string;
      incomeORpay,iop:boolean{I=T;P=F};
      member,month:byte;
      start,end_:byte;
      code:integer;
      got:longint;got_:real;
      tax:real;
      i:byte;
  begin
    fillchar(pay,sizeof(pay),0);
    fillchar(income,sizeof(income),0);
    readln(m);
    readln(s);while s[length(s)]=' ' do s[0]:=pred(s[0]);
    while s<>'#' do begin
      incomeORpay:=upcase(s[1])='I';
      start:=3*ord(incomeORpay)+5;
      end_:=pos(' ',copy(s,start,length(s)-start+1))-1;
      val(copy(s,start,end_),member,code);
      if code<>0 then HALT(1);
      start:=start+end_+1;
      end_:=pos('/',s)-start;
      val(copy(s,start,end_),month,code);
      if code<>0 then HALT(2);
      start:=pos(' ',copy(s,start,length(s)-start+1))+start;
      end_:=length(s)-start+1;
      val(copy(s,start,end_),got,code);
      if code<>0 then HALT(3);
      if incomeORpay{=True=Income} then begin
        if got<4000 then got_:=got-800 else got_:=got*0.8;
        if got_<0 then got_:=0;
        tax:=0;
        if got_>0     then tax:=    (got_      )*0.2;
        if got_>20000 then tax:=tax+(got_-20000)*0.1;
        if got_>50000 then tax:=tax+(got_-50000)*0.1;
        income:=income+tax;
      end else begin
        inc(pay[member,month],got);
      end;
      readln(s);
      while s[length(s)]=' ' do s[0]:=pred(s[0]);
      while s[1]=' ' do delete(s,1,1);
      i:=1;while i<length(s) do
       if copy(s,i,2)='  ' then delete(s,i,1)
       else inc(i);
    end;
  end;
  procedure count;
    var
      i,j:byte;
      tax:real;
  begin
    for i:=1 to m do
     for j:=1 to 12 do begin
       pay[i,j]:=pay[i,j]-800;
       if pay[i,j]<0 then pay[i,j]:=0;
       tax:=0;
       if pay[i,j]>0       then tax:=    (pay[i,j]        )*0.05;
       if pay[i,j]>500     then tax:=tax+(pay[i,j]-500    )*0.05;
       if pay[i,j]>2000    then tax:=tax+(pay[i,j]-2000   )*0.05;
       if pay[i,j]>5000    then tax:=tax+(pay[i,j]-5000   )*0.05;
       if pay[i,j]>20000   then tax:=tax+(pay[i,j]-20000  )*0.05;
       if pay[i,j]>40000   then tax:=tax+(pay[i,j]-40000  )*0.05;
       if pay[i,j]>60000   then tax:=tax+(pay[i,j]-60000  )*0.05;
       if pay[i,j]>80000   then tax:=tax+(pay[i,j]-80000  )*0.05;
       if pay[i,j]>100000  then tax:=tax+(pay[i,j]-100000 )*0.05;
        income:=income+tax;
     end;
  end;
begin
  inputdate;
  count;
  writeln(income:round(ln(income)/ln(10)+1):2);
end.

板凳


你应该是对的!我的把
      if a[i,j]<=80000 then sum:=sum+14625+(a[i,j]-60000)*0.35 else
      if a[i,j]<=100000 then sum:=sum+21625+(a[i,j]-80000)*0.4 else
       sum:=sum+29625+(mon-100000)*0.45;
中的mon 换成a[i,j]就对了,我太粗心了!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册