一道C语言作业
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道C语言作业相关的知识,希望对你有一定的参考价值。
是一道填空题,一共5个空,已用■标记醒目,如下:
本C语言程序用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税总额。职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或薪金)。由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于0结束。
假设个人所得税法规定;个人收入所得,按月计税,以每月收入总额减除免税金额800元后的余额作为该月的月应纳税所得额,适用税率如下表所示。
------------------------------------------------------------------
级数 月应纳税所得额 适用税率(%)
1 不超过500元的部分 5
2 501元~2000元的部分 10
3 2001元~5000元的部分 15
4 5001元~20000元的部分 20
5 20001元~40000元的部分 25
6 40001元~60000元的部分 30
7 60001元~80000元的部分 35
8 80001元~100000元的部分 40
9 超过100000元的部分 45
------------------------------------------------------------------
上表表明,个人收入所得税是按照超额累进的税率来征收的。
设一个人的月应纳税所得额为K(元),用下面的公式计算其应缴纳的个人所得税额S(元):
若0<K≤500,则S=K×5%;
若500<K≤2000,则S=500×5%+(K—500)×10%:
若2000<K≤5000,则S=500×5%+1500×10%+(K-2000)×15%:
若5000<K≤20000,则S=500×5%+1500×10%+3000×15%+(K-5000)×20%:
例如,某人某月工资总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。
#include <stdio.h>
#define MaxNum 50
#define BASE 800 /*免税金额基数*/
int paylevel[]=0,500,2000,5000,20000,40000,60000,80000,100000,1000001;
int taxPrate[]=5,10,15,20,25,30,35,40,45; /*税率表*/
typedef struct
int Id; /*职工的工号*/ .
long Salary; /*职工的工资*/
Info;
/* 查找工号为Id的职工在数组employee中的下标,返回值为0表示没有 */
int find(int Id,Info employee[],int m)
int j;
employee[0].Id=Id;
for(j=m;■填空1________;j--);
return j;
void main(void)
Info employee[MaxNum+1];
long Wage;
double sum=0,K,S:
int i,j,N=0,Code;
scanf("%d%ld",&Code,&Wage); /*读入职工号、工资或薪金*/
while(Code>0)
i=find(Code,employee,N);
if (i>0)employee[i].Salary += Wage:
else ■填空2________;
employee[N].Id=Code;employee[N].Salary=Wage;
scanf("%d%ld",&Code,&Wage):
for (i=1;i<=N;i++)
K = ■填空3________; /*计算月应纳税所得额*/
S=0; /*月应纳税额赋初值*/
if (K > 0)
for (j=1;j<=9;j++)
if(■填空4________) /*月应纳税所得额超过第j级*/
S=S+(paylevel[j]-paylevel[j-1])*taxPrate[j-1]/100;
else S=S+(■填空5________)*taxPrate[j-1]/100;break;
printf("职工%d应缴纳的个人所得税额:%10.21f\n",employee[i].Id,S);
sum += S;
printf("全体职工个人所得税总额:%10,21f\n",sum);
(1)employee[j].Id!=Id
(2)++N 或 N++ 或 N=N+1
(3)employee[i].Salary-BASE
(4)K>paylevel[j]
(5)K>paylevel[j-1]
顺便说一下我的感受,「百度知道」是帮助大家答疑解惑的地方,到这里求助的人肯定是遇到了困难需要大家的帮助,请朋友们心平气和宽容大度。「和平山后」这位朋友似乎太激动和恶意揣测了,请珍惜这里的祥和气氛。本回答被提问者采纳 参考技术B 这一题还真是挺难的,估计没人能解答得出来吧 参考技术C 眼都看花了。 参考技术D 谢谢!!
[HNOI2011]数学作业
题目描述
小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:
给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。
输入输出格式
输入格式:
从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足1≤N≤1000000;100%的数据满足1≤N≤1018且1≤M≤109.
输出格式:
输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。
输入输出样例
13 13
4
矩阵快速幂:
si+1=si*10x+i+1
当前状态S=(si i 1)
递推矩阵T=
10x 0 0
1 1 0
1 1 1
注意所有变量开long long
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 long long Mod; 7 struct Matrix 8 { 9 long long a[4][4]; 10 Matrix operator * (const Matrix &x) const{ 11 Matrix ans; 12 memset(ans.a,0,sizeof(ans.a)); 13 for(int i=0;i<=2;++i) 14 for(int j=0;j<=2;++j) 15 for(int k=0;k<=2;++k) 16 ans.a[i][j]=(ans.a[i][j]+(a[i][k]*x.a[k][j])%Mod)%Mod; 17 return ans; 18 } 19 }; 20 Matrix k; 21 Matrix s; 22 long long last; 23 Matrix pow(Matrix x,long long p) 24 { 25 Matrix res; 26 res.a[0][0]=last;res.a[0][1]=0;res.a[0][2]=0; 27 res.a[1][0]=1;res.a[1][1]=1;res.a[1][2]=0; 28 res.a[2][0]=1;res.a[2][1]=1;res.a[2][2]=1; 29 while (p) 30 { 31 if (p%2==1) 32 { 33 res=res*k; 34 } 35 k=k*k; 36 p/=2; 37 } 38 return res; 39 } 40 long long min(long long a,long long b) 41 { 42 if (a<b) return a; 43 else return b; 44 } 45 int main() 46 { 47 long long n,i; 48 cin>>n>>Mod; 49 s.a[0][0]=0;s.a[0][1]=0;s.a[0][2]=1; 50 i=1; 51 do 52 { 53 i*=10; 54 last=i%Mod; 55 k.a[0][0]=i%Mod;k.a[0][1]=0;k.a[0][2]=0; 56 k.a[1][0]=1;k.a[1][1]=1;k.a[1][2]=0; 57 k.a[2][0]=1;k.a[2][1]=1;k.a[2][2]=1; 58 long long l=min(i-1,n)-i/10; 59 } 60 while (n>=i); 61 cout<<s.a[0][0]; 62 }
以上是关于一道C语言作业的主要内容,如果未能解决你的问题,请参考以下文章