工资计算
小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资为S元,则他应交的个人所得税按如下公式计算:
1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元;
2) A中不超过1500元的部分,税率3%;
3) A中超过1500元未超过4500元的部分,税率10%;
4) A中超过4500元未超过9000元的部分,税率20%;
5) A中超过9000元未超过35000元的部分,税率25%;
6) A中超过35000元的部分,税率30%;
例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,
超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。
已知小明这个月税前所得为S元,请问他的税后工资T是多少元。
输入格式
输入为一个整数S,表示小明的税前工资。所有评测数据保证小明的税前工资为一个整百的数。
输出格式
输出一个整数T,表示小明的税后工资。
样例输入
10000
样例输出
9255
评测用例规模与约定
对于所有评测用例,1 ≤ T ≤ 100000。
#include <stdio.h>
int main()
{
//输入
int S = 0;
int T = 0;
scanf("%d",&S);
int A = S - 3500;
//计算
if(A<=0)
{
T = S;
}
else if(A<=1500)
{
T = 3500+A*0.97;
}
else if(A<=4500)
{
T = 4955+(A-1500)*0.9;
}
else if(A<=9000)
{
T = 7655+(A-4500)*0.8;
}
else if(A<=35000)
{
T = 11255+(A-9000)*0.75;
}
else if(A>35000)
{
T = 30755+(A-35000)*0.7;
}
//输出
printf("%d",T);
return 0;
}
迭代法求根
#include <stdio.h>
#include <math.h>
int main()
{
double a,x0,x1;
scanf("%lf",&a);
x0=a/2.0;//设置一个x0初始值,再慢慢通过公式递归迭代出误差较小的结果
x1=(x0+(a/x0))/2;//套用公式
while(fabs(x1-x0)>=(1E-5))//fabs是绝对值函数,返回括号里的绝对值 1E-5=1*10的-5次方
{
x0=x1;
x1=(x0+(a/x0))/2;
}
printf("%.5lf",x1);
return 0;
}
最大公约数和最小公倍数的计算
问题描述:
输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
输入说明:
输入两个正整数 m 和 n。
输出说明:
输出 m 和 n 的最大公约数和最小公倍数。
输入样例:
8 12
输出样例:
4 24
#include <stdio.h>
int main()
{
//初始化数据,获取输入
int m = 0;
int n = 0;
scanf("%d%d",&m,&n);
int m1 = m;
int n1 = n;//辗转相除法会改变数值所以需要一个替身
int t2 = 1;
//排序
if(m1>n1)
{
int t1 = n1;
m1 = n1;
n1 = t1;
}
//辗转相除法求出最大公约数
while(n1)
{
int t2 = m1 % n1;
m1 = n1;
n1 = t2;//m1就是最大公约数
}
//m*n/m1就是最小公倍数
printf("%d %d",m1,m*n/m1);
return 0;
}
整数分析
#include <stdio.h>
void bubble_sort(int num[],int len)
{
int i = 0;
for(i=0;i<len-1;i++)
{
int sign = 1;//假设这一趟已经有序
int j = 0;
for(j;j<len-1-i;j++)
{
if(num[j]>num[j+1])
{
int exchange = num[j];
num[j] = num[j+1];
num[j+1] = exchange;
sign = 0;//说明本趟排序已经进行,数组并不有序
}
}
if(sign == 1)
{
break;//本趟没有进行,说明数组已经有序,直接跳出循环,不需要进行下一趟
}
}
}
int main()
{
int n = 0;
scanf("%d",&n);
int m = n;
int i = 0;
//计算位数
int digit = 1;
for(i=0;n>=10;i++)
{
n /= 10;
digit++;
}
//将每一位存入数组,并冒泡排序
int num[9] = {0};
for(i=0;i<digit;i++)
{
num[i] = m%10;
m /= 10;
}
bubble_sort (num,digit);
//找到最大最小
int max = num[0];
int min = num[0];
for(i=0;i<digit;i++)
{
if(num[i]>max)
{
max = num[i];
}
if(num[i]<min)
{
min = num[i];
}
}
printf("%d %d %d",digit,max,min);
return 0;
}
跳一跳
问题描述
跳一跳是一款微信小游戏,游戏规则非常简单,只需玩家要从一个方块跳到下一个方块,如果未能成功跳到下一个方块则游戏结束。
计分规则如下:
1. 如果成功跳到下一个方块上,但未跳到方块中心,加1分
2. 如果成功跳到下一个方块上,且刚好跳到方块中心,则第一次加2分,此后连续跳到中心时每次递增2分。也就是说,第一次跳到方块中心加2分,连续第二次跳到方块中心加4分,连续第三次跳到方块中心加6分,…,以此类推。
3. 如果未能成功跳到方块上,加0分,且游戏结束
现在给出玩家一局游戏的每次跳跃情况,请计算玩家最终得分。
输入说明
输入为若干个非零整数(整数个数小于1000),表示玩家每次的跳跃情况。整数之间用空格分隔,整数取值为0,1,2。
0 表示未能成功跳到下一个方块上,
1 表示成功跳到下一个方块上但未跳到方块中心,
2 表示成功跳到下一个方块上,且刚好跳到方块中心。
输入的数据只有最后一个整数是0,其余均非零。
输出说明
输出一个整数表示该玩家的最终得分。
输入样例
1 1 2 1 2 2 2 0
输出样例
17
#include <stdio.h>
int main()
{
//初始化,获取数据
int num[1000] = {0};
int i = 0;
int j = 0;
int judge = 1;
int grades = 0;
int g1 = 0;
do
{
scanf("%d",&num[i]);
judge = num[i];
i++;
} while(judge);
//计算分数
for(j;j<i-1;j++)
{
if(num[j] == 1)
{
grades++;
g1 = 0;
}
else if(num[j] == 2)
{
g1+=2;
grades = g1 + grades;
}
}
//输出
printf("%d",grades);
return 0;
}
完数
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
int i = 0;
int j = 0;
for(i=a;i<b;i++)
{
int sum = 0;
for(j=1;j<i;j++)
{
if(i%j == 0)
{
sum = sum+j;
}
}
if(sum == i)
{
printf("%d\n",i);
}
}
return 0;
}
自然数分解
问题描述
任何一个自然数 m 的立方均可写成 m 个连续奇数之和。例如:
1
3
=1
2
3
=3+5
3
3
=7+9+11
4
3
=13+15+17+19
编程实现:输入一自然数 n,求组成 n
3 的 n 个连续奇数。
输入说明
一个正整数 n,0<n<30。
输出说明
输出 n 个连续奇数,数据之间用空格隔开,并换行
输入样例
4
输出样例
13 15 17 19
#include <stdio.h>
int main()
{
//输入
int m = 0;
scanf("%d",&m);
int m3 = m*m*m;
int m2 = m*m;
int i = 0;
int j = 0;
int n1 = 0;
int n2 = 0;
int k = 0;
//计算,如果m是奇数中间项一定是它的平方,如果是偶数中间两项平均数是它的平方
if(m%2 == 1)
{
i = (m2 - 1)/2;
j = (m - 1)/2;
n1 = i+j;
n2 = i-j;
for(k=n2;k<=n1;k++)
{
printf("%d ",2*k+1);
}
}
else if(m%2 == 0)
{
i = (m2 - 2)/2;
j = m/2;
n1 = i+j;
n2 = i-j+1;
for(k=n2;k<=n1;k++)
{
printf("%d ",2*k+1);
}
}
return 0;
}
日期计算
问题描述
给定一个年份y和一个整数d,问这一年的第d天是几月几日?
注意闰年的2月有29天,且满足下面条件之一的是闰年:
1) 年份是4的整数倍,而且不是100的整数倍;
2) 年份是400的整数倍
输入说明
输入包含两个整数y和d,y表示年份,年份在1900到2018之间(包含1900和2018)。 d表示这一年的第几天,d在1至365之间。
输出说明
在一行输出两个整数,分别表示答案的月份和日期。
输入样例
2015 80
输出样例
3 21
#include <stdio.h>
int is_leap(int x)
{
if((x%4 == 0 && x%100!=0) || x%400 == 0)
return 1;
else
return 0;
}
int main()
{
//初始
int year = 0;
int day = 0;
scanf("%d%d",&year,&day);
int ret = 0;
//判断是不是闰年,是返回1,不是返回0
ret = is_leap(year);
if(ret == 0)
{
//输出具体日期(平年)
if(day<=31)
{
printf("1 %d",day);
}
else if(day<=59)
{
printf("2 %d",day-31);
}
else if(day<=90)
{
printf("3 %d",day-59);
}
else if(day<=120)
{
printf("4 %d",day-90);
}
else if(day<=151)
{
printf("5 %d",day-120);
}
else if(day<=181)
{
printf("6 %d",day-151);
}
else if(day<=212)
{
printf("7 %d",day-181);
}
else if(day<=243)
{
printf("8 %d",day-212);
}
else if(day<=273)
{
printf("9 %d",day-243);
}
else if(day<=304)
{
printf("10 %d",day-273);
}
else if(day<=334)
{
printf("11 %d",day-304);
}
else if(day<=365)
{
printf("12 %d",day-334);
}
}
else if(ret == 1)
{
//输出具体日期(闰年)
if(day<=31)
{
printf("1 %d",day);
}
else if(day<=60)
{
printf("2 %d",day-31);
}
else if(day<=91)
{
printf("3 %d",day-60);
}
else if(day<=121)
{
printf("4 %d",day-91);
}
else if(day<=152)
{
printf("5 %d",day-121);
}
else if(day<=182)
{
printf("6 %d",day-152);
}
else if(day<=213)
{
printf("7 %d",day-182);
}
else if(day<=244)
{
printf("8 %d",day-213);
}
else if(day<=274)
{
printf("9 %d",day-244);
}
else if(day<=304)
{
printf("10 %d",day-274);
}
else if(day<=335)
{
printf("11 %d",day-304);
}
else if(day<=366)
{
printf("12 %d",day-335);
}
}
return 0;
}
整数比较1
描述:
编写程序,对于从键盘输入的2个整数,先输出较大者的个位数字,然后输出较小者的平方值。
输入说明:
输入的两个整数之间以一个空格分隔。
输出说明:
在一行上输出两个整数,整数之间以一个空格分隔,最后换行。
输入样例
样例1输入
29989 372
输出样例
样例1输出
9 138384
#include <stdio.h>
int main()
{
//初始
int m = 0;
int n = 0;
scanf("%d %d",&m,&n);
int max = m;
int min = n;
if(max<min)
{
int t1 = min;
min = max;
max = t1;
}
//输出
printf("%d %d",max%10,min*min);
return 0;
}
整数比较2
从键盘输入四个整数,要求按由小到大的顺序输出。
输入说明:
输入四个整数,以空格间隔。
输出说明:
输出排序后的整数,以空格间隔。
输入样例
样例1输入
-99 9 99 -9
输出样例
样例1输出
-99 -9 9 99
#include <stdio.h>
void bubble_sort(int num[],int len)
{
int i = 0;
for(i=0;i<len-1;i++)
{
int j = 0;
for(j=0;j<len-i-1;j++)
{
if(num[j]>num[j+1])
{
int tmp = num[j];
num[j] = num[j+1];
num[j+1] = tmp;
}
}
}
}
int main()
{
//初始
int num[4] = {0};
int i = 0;
for(i=0;i<4;i++)
{
scanf("%d",&num[i]);
}
//冒泡排序
bubble_sort(num,4);
//输出
for(i=0;i<4;i++)
{
printf("%d ",num[i]);
}
return 0;
}
分段函数1
#include <stdio.h>
#include <math.h>
int main()
{
double x = 0;
double fx = 0;
scanf("%lf",&x);
if(x>=0)
{
fx = sqrt(x);
}
else if(x<0)
{
fx = (x+1)*(x+1)+2*x+1/x;
}
printf("%.2f",fx);
return 0;
}
分段函数2
#include <stdio.h>
int main()
{
int x = 0;
int fx = 0;
scanf("%d",&x);
if(x<1)
{
fx = x;
}
else if(1<=x && x<10)
{
fx = 2*x-1;
}
else if(x>=10)
{
fx = 3*x-11;
}
printf("%d",fx);
return 0;
}
输出金字塔
请输入一个大写字母作为字母金字塔的最大字母
示例:
输入:C
输出: A
ABA
ABCBA (最后一行开头无空格)
#include <stdio.h>
int main()
{
//初始化
char in,k;
scanf("%c",&in);
int i = 0;
int j = 0;
//打印金字塔,每行分成三个部分,空格,左边字母,右边字母
for(i=65;i<=in;i++)//记录行数
{
for(j=0;j<in-i;j++)
{
printf(" ");
}//空格
for(k=65;k<=i;k++)
{
printf("%c",k);
}//左边字母
for(k=i-1;k>=65;k--)
{
printf("%c",k);
}//右边字母
printf("\n");
}
return 0;
}