目录
1.统计进位
描述:
很多小学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个3位数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个整数0(这是输入结束标记)。
int main()
{
int m = 0;
int n = 0;
int count = 0;
int arr[100];
// 直到输入两个0
while(scanf("%d %d",&m,&n) == 2)
{
if(!m && !n)
{
break;
}
int sum = 0;
int goBit = 0;
while(n > 0 && m > 0)
{
if((n % 10 + m % 10 + goBit) >= 10)
{
sum++;
// 这里不能直接对n进行+1
// 可能导致n直接进位
// n /= 10;
// m /= 10;
// n++;
goBit = 1;
}
else
{
goBit = 0;
}
n /= 10;
m /= 10;
}
arr[count] = sum;
printf("%d\n",arr[count]);
count++;
}
return 0;
}
2.数组逆序
描述:
编写C语言程序,从键盘输入m个整数,然后以相反的顺序输出。
输入格式:
第1行是整数m。
接下来一共m行数据,每行包含一个整数n。
void swap(long long arr[],int n)
{
int i = 0;
for(i = n - 1; i >= 0;i--)
{
printf("%lld\n",arr[i]);
}
}
int main()
{
int m;
scanf("%d",&m);
int i = 0;
long long arr[1000] = {0};
for(i = 0; i < m;++i)
{
scanf("%lld",&arr[i]);
}
swap(arr,m);
return 0;
}
3.分解质因数(二)
问题描述:
分解质因数:任何一个合数都可以写成若干个质数(素数)相乘的形式。例如:
2000 = 2×2×2×2×5×5×5
2005 = 5×401
2010 = 2×3×5×67
编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),然后对m和n之间(包括m和n)的所有整数分解质因数,并输出到屏幕。每行显示1个整数分解。
输入格式:
一共1行数据,包含两个整数m和n(使用空格分隔)。
输出格式:
输出n – m + 1行信息,等号和星号的左右两边各有一个空格,行末没有空格。
如果n是素数,则输出n。
如果n是合数,则按升序输出n的所有质因数,之间使用星号(*)代替中文乘号(×)。
void printSu(int num)
{
int flag = 0;
printf("%d = ",num);
int j = 0;
for(j = 2;j <= num;++j)
{
while(num % j == 0)
{
if(flag)
{
printf(" * ");
}
printf("%d",j);
num /= j;
flag = 1;
}
}
printf("\n");
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
if(n > m)
{
int tmp = n;
n = m;
m = tmp;
}
int i = 0;
for(i = n; i <= m; ++i)
{
printSu(i);
}
return 0;
}
4.孪生素数
问题描述
编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),统计在区间[m, n]孪生素数对(差为2的两个相邻素数)的数量。
例如,在区间[2, 100]的孪生素数为(3, 5)、(5, 7)、(11, 13)、(17, 19)、(29, 31)、(41, 43)、(59, 61)、(71, 73),一共8对。
输入格式
一共1行数据,包含整数m和n,之间使用空格分隔。
输出格式
输出孪生素数对的数量,行末没有换行符。
int main()
{
int n,m;
scanf("%d %d",&n,&m);
if(n > m)
{
int tmp = n;
n = m;
m = tmp;
}
int i = 0;
int arr[1000000] = {0};//存储素数
int count = 0; // 记录数组大小
int flag = 0;
for(i = n; i <= m;++i)
{
flag = 0;
int j = 0;
//根号判断素数
for(j = 2; j*j <= i;++j)
{
if(i % j == 0)
{
flag = 1;
break;
}
}
if(!flag)
{
arr[count] = i;
count++;
}
}
int x = 0;
int ret = 0;
// arr的数组索引在 [0,count - 1]的区间 超过则数组越界
for(x = 0; x < count - 1;x++)
{
if(arr[x+1] - arr[x] == 2)
{
ret++;
}
}
printf("%d\n",ret);
return 0;
}
5.连续1的个数
问题描述
编写C语言程序,从键盘读入一个个位数字不为5的奇数odd,然后计算至少多少个连续的1组成的整数能被该奇数整除。
例如:odd等于13,则至少6个连续的1组成的整数(111111)能被13整除(即111111 / 13 = 8547)。
输入格式
一共1行数据,包含一个奇数odd。
int main()
{
int n;
scanf("%d",&n);
if(n == 1)
{
printf("1");
}
else
{
long long sum = 1;
int nub = 1;
while(sum != 0)
{
sum = (sum*10 + 1) % n;
nub++;
}
printf("%d",nub);
}
return 0;
}
6.解不等式(二)
问题描述
求解下面关于x的不等式:
n < 1 + 1/2 + 1/3 + ⋯⋯ + 1/x < n+1
编写C语言程序,从键盘读入一个整数n,然后求解上面关于x的不等式,并输出结果到屏幕。
输入格式
一共1行数据,包含整数n。
输出格式
输出满足不等式的x的最小整数和最大整数,之间使用一个空格分隔,行末没有换行符。
int main()
{
int n;
scanf("%d",&n);
double sum = 0.0;
int min_x = 1, max_x = 1;
int x = 1;
while(x)
{
sum+=1.0/x;
// 判断是否大于n 并且是第一次赋值的最小值
if(sum > n && min_x == 1)
{
min_x = x;
}
if(sum >= n+1 )
{
max_x = x - 1;
break;
}
x++;
}
printf("%d %d",min_x,max_x);
return 0;
}
7.完美数(二)
问题描述
正整数n的所有小于n的正因数之和如果等于n本身,则称n是完美数(Perfect Number)。例如,6和28都是完美数,因为:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
编写C语言程序,从键盘读入两个整数m和n(使用空格分隔),然后输出m和n之间(包括m和n)的所有“完美数”到屏幕。每行显示1个完美数,并统计在区间[m, n]完美数的数量。
输入格式
一共1行数据,包含两个整数m和n(使用空格分隔)。
输出格式
每行输出1个完美数。最后一行输出完美数的个数。如果该区间没有完美数,则输出0。
“+”和“=”的两边各有一个空格。
每行的行末没有空格。
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int ret = 0;
if (n > m) {
int tmp = n;
n = m;
m = tmp;
}
for (int i = n; i <= m; ++i) {
int sum = 0;
int j = 1;
// 根号求素数
for ( j = 1; j * j <= i; ++j) {
if (i % j == 0) {
sum += j;
// 加上i / j 的另一个因子
if (j != 1 && j != i / j) { // 避免加上自己和重复加上平方根
sum += i / j;
}
}
}
// 检查是否为完美数
if (sum == i) {
if(i == 1)
{
continue;
}
printf("%d = 1", i);
int j = 1;
int flag = 0;
for (j = 2; j < i; ++j) {
if (i % j == 0) {
printf(" + ");
printf("%d", j);
}
}
printf("\n");
ret++;
}
}
printf("%d",ret);
return 0;
}
8.循环字母字符串
问题描述
编写程序,从键盘读入一个英文字母,如果是大写字母,则从该字母开始按升序输出大写形式的字母表,在输出最后一个字母Z后,继续从字母A输出,直到26个大写字母全部输出完毕;如果是小写字母,则从该字母开始按升序输出小写形式的字母表,在输出最后一个字母z后,继续从字母a输出,直到26个小写字母全部输出完毕。
输入样例
F
输出样例
FGHIJKLMNOPQRSTUVWXYZABCDE
int main()
{
char n;
scanf("%c",&n);
if(n >= 'A' && n <= 'Z')
{
int i = 0;
for(i = 0; i < 26; ++i )
{
printf("%c",n);
n++;
if(n > 'Z')
{
n = 'A';
}
}
}
else if(n >= 'a' && n <= 'z')
{
int i = 0;
for(i = 0; i < 26; ++i )
{
printf("%c",n);
n++;
if(n > 'z')
{
n = 'a';
}
}
}
else
{
printf("error");
}
return 0;
}
9.公因数与公倍数
最大公因数(Greatest Common Divisor,简称GCD),也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。整数m和n的最大公约数记为GCD(m, n)。
最小公倍数(Least Common Multiple,简称LCM)是指两个或多个整数共有的倍数中除了0以外最小的一个。整数m和n的最小公倍数记为LCM(m, n)。
整数m、n、GCD(m, n)以及LCM(m, n)的关系是:
m ×n=GCD(m,n) ×LCM(m,n)
问题描述
编写程序,从键盘读入两个整数m和n(使用空格分隔),然后输出m和n的最大公约数和最小公倍数到屏幕。
int main()
{
long long n,m;
scanf("%lld %lld",&n,&m);
if(n > m)
{
int t = n;
n = m;
m = t;
}
// 提前存取用于求最小公倍数
long long i = n;
long long j = m;
long long tmp = 0;
while(n != 0)
{
tmp = m % n;
m = n;
n = tmp;
}
printf("%lld\n",m);
// 利用公式 n * m = 最大公约数 * 最小公约数
long long small = (i*j) / m;
printf("%lld",small);
return 0;
}
10.水仙花数
问题描述
一个n位整数,如果等于它的n个数字的n次方之和,则该n位数称为n位水仙花数。
- 一个三位数,如果等于它的三个数字的三次方之和,则该三位数称为三位水仙花数;
- 一个四位数,如果等于它的四个数字的四次方之和,则该四位数称为四位水仙花数;
例如,153是其中一个三位水仙花数:
153= 1^3+ 5^3+ 3^3=1+125+27
编写程序,输出所有三位水仙花数。每行输出一个水仙花数。
#include <math.h>
int main()
{
int i = 0;
for (i = 100; i < 1000; ++i)
{
int gewei = pow((i % 10),3);
int shiwei = pow((i % 100 / 10),3);
int baiwei = pow((i / 100),3);
if(gewei + shiwei + baiwei == i)
{
printf("%d\n",i);
}
}
return 0;
}
11.个人所得税
问题描述
假设某地区个人所得税的缴纳方式如下:
月总收入在1600元以下(含1600元)不需要缴纳个人所得税。月总收入在1600元以上,那么需要缴税的部分为:月总收入-1600,简称“应税收入”,且分级逐级计算:
- 应税收入在500元内(含500元)的部分,税率为5%;
- 应税收入在500元~2000元内(含2000元)的部分,税率为10%;
- 应税收入2000元~5000元内(含5000元)的部分,税率为15%;
- 应税收入5000元~10000元内(含10000元)的部分,税率为20%;
- 应税收入在10000元以上的部分,税率为30%。
例如,某职工的当月的总收入为7000元,那么他应缴的个人所得税计算如下:
(1) 应税收入 = 月总收入 - 1600 = 7000 - 1600 = 5400 (元)
(2) 500元内的所得税 = 500 * 5% = 25 (元)
(3) 500元~2000元内的所得税 = (2000 - 500) * 10% = 150 (元)
(4) 2000元~5000元内的所得税 = (5000 - 2000) * 15% = 450 (元)
(5) 5000元~10000元内的所得税 = (5400 - 5000) * 20% = 80 (元)
(6) 应缴纳的个人所得税共计 = 25 + 150 + 450 + 80 = 705 (元)
编写程序,从键盘读入月总收入,然后计算应缴的个人所得税。
int main()
{
double n;
scanf("%lf",&n);
double x = 0;
if(n < 1600)
{
printf("0.00");
return 0;
}
else
{
int ret = n - 1600;
if(ret <= 500)
{
x += ret * 0.05;
}
else
{
x += 500 * 0.05;
if(ret <= 2000)
{
x += (ret - 500) * 0.1;
}
else
{
x += (2000 - 500) * 0.1;
if(ret <= 5000)
{
x += (ret - 2000) * 0.15;
}
else
{
x += (5000 - 2000) * 0.15;
if(ret <= 10000)
{
x += (ret - 5000) * 0.2;
}
else
{
x += (10000 - 5000) * 0.2;
x += (ret - 10000) * 0.3;
}
}
}
}
printf("%.2lf",x);
}
return 0;
}