19.输出闰年:输出21世纪中截至某个年份之前的所有闰年年份。判断闰年的条件是:能被4整除但不能被100整除,或者能被400整除。
/*输出闰年*/
#include <stdio.h>
int main(void) {
int n; // 截止年份
printf("请输入一个截止年份:");
scanf("%d", &n);
printf("2000年至%d年之间的闰年如下:\n", n);
for (int i = 2000; i <= n; i++) {
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
printf("%d\n", i);
}
}
return 0;
}
20.用格雷戈里公式求给定进度的π值。
使用格雷戈里公式求π的近似值,要求精确到最后一项的绝对值小于给定精度eps。公式为:
/*用格雷戈里公式计算π的近似值*/
#include<stdio.h>
#include<math.h>
int main(void){
int denominator=1,i=1;
//denominator为分母,赋初值为1,i表示当前项数序号,初始值为1
double eps,flag=1.0,pi=0,item=1.0;
//eps为精度值,flag为正负号,赋初值为正,pi存放累加和,初始值为0,item存放当前项值,初始值为1.0
printf("请输入精度值eps:");
scanf("%lf",&eps);
while(fabs(item)>=eps){//fabs为求绝对值函数
pi=pi+item;
i++;
flag=-flag;//改变正负号
denominator=denominator+2;
item=flag/denominator;
}
pi=pi+item;//加上最后一项
pi=pi*4;
printf("π=%lf\n",pi);
printf("最后一项的项数是:%d",i);
return 0;
}
21.统计一个整数的位数。从键盘读入一个整数,统计该数的位数。例如输入12534,输出5;输入-99,输出2;输入0,输出1;
/*统计整数位数*/
#include<stdio.h>
int main(void){
int count,number,temp;//count记录位数,number为输入数字,temp为临时变量。
count=0;
printf("请输入一个整数:");
scanf("%d",&number);
temp=number;
if(number<0)//如果number小于0,转换为正数
temp=-number;
do{
count++;
temp=temp/10;
}while(temp!=0);
printf("%d的位数为%d",number,count);
return 0;
}
22.逆序输出一个整数的各位数字。输入一个整数,将其逆序输出。例如:输入12345,输出54321。
/*逆序输出一个整数*/
#include <stdio.h>
int main() {
int num, reversed = 0;
printf("请输入一个整数:");
scanf("%d", &num);
// 逆序输出各位数字
while (num != 0) {
int digit = num % 10; // 取出最后一位数字
reversed = reversed * 10 + digit; // 将数字添加到反转结果中
num /= 10; // 去掉最后一位数字
}
printf("逆序输出结果为:%d\n", reversed);
return 0;
}
23.判断一个整数是否为素数。输入一个正整数m,判断它是否为素数。素数就是只能能被1和自身整除的正整数,1不是素数,2是素数。
/*判断素数*/
#include<stdio.h>
#include<math.h>
int main(void){
int m,limit,i;
printf("请输入一个正整数:");
scanf("%d",&m);
if(m<=1){
printf("小于等于1的数不是素数!");
}else if(m==2){
printf("2是素数!");
}else{
limit=sqrt(m)+1;
for(i=2;i<=limit;i++){
if(m%i==0){
break;//若m能被某个i整除,则m不是素数,结束循环
}
}
if(i>limit){
printf("%d是素数",m);
}else{
printf("%d不是素数!",m);
}
}
return 0;
}
24.简单的猜数游戏。输入你所猜的数(假定为1~100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜7次。
/*猜数游戏*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
int count=0,flag,mynumber,yournumber;
srand(time(0));//设定随机数的产生与系统时钟相关联
mynumber=rand()%100+1;//随机产生一个1~100之间的被猜数
flag=0;//flag为0表示没猜中,为1表示猜中了
while(count<7){
printf("请输入你猜的数:");
scanf("%d",&yournumber);
count++;
if(yournumber==mynumber){
printf("恭喜你!猜中啦!");
flag=1;
break;//已猜中,终止循环
}else if(yournumber>mynumber){
printf("猜大了!");
}else{
printf("猜小了!");
}
}
if(flag==0){
printf("游戏结束!");
}
return 0;
}
25.猜数字游戏加强版。先输入2个不超过100的正整数,分别是被猜数mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进行比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜n次。如果1次就猜出该数,提示“Bingo!”;如果3次以内猜出该数,则提示“Lucky You!”;如果超过3次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,则提示“Game Over”;如果在到达n次之前,用户输入了一个负数,也输出“Game Over”并结束程序。
/*猜数游戏*/
#include <stdio.h>
int main() {
int mynumber, n, yournumber, attempts = 0;
printf("请输入被猜数(不超过100的正整数):");
scanf("%d", &mynumber);
printf("请输入允许猜测的最大次数:");
scanf("%d", &n);
while (attempts < n) {
printf("请输入你猜的数:");
scanf("%d", &yournumber);
if (yournumber < 0) {
printf("Game Over\n");
break;
}
attempts++;
if (yournumber == mynumber) {
if (attempts == 1) {
printf("Bingo!\n");
} else if (attempts <= 3) {
printf("Lucky You!\n");
} else {
printf("Good Guess!\n");
}
break;
} else {
if (yournumber < mynumber) {
printf("猜小了\n");
} else {
printf("猜大了\n");
}
}
}
if (attempts >= n) {
printf("Game Over\n");
}
return 0;
}
26.使用函数求阶乘和。输入一个正整数n(n≤16),计算1!+2!+3!+...+n!。要求定义和调用函数fact(n)计算n的阶乘,如果n是非负数,则该函数返回n的阶乘,否则返回0.
/*计算阶乘和*/
#include<stdio.h>
double fact(int n);
int main(void){
int n;
double sum=0;
printf("请输入一个正整数n:");
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum+=fact(i);
}
printf("1!+2!+...+%d!=%.0lf\n",n,sum);
return 0;
}
/*求n!的函数*/
double fact(int n){
double result=1;
if(n<0){
return 0;
}
for(int i=1;i<=n;i++){
result*=i;
}
return result;
}
27.求e的值:输入一个正整数n,计算下式的前n项之和(保留4位小数)。
//求e的值
#include <stdio.h>
double calculateE(int n);
int main(void) {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
double e = calculateE(n);
printf("e的值为%.4lf", e);
return 0;
}
double calculateE(int n) {
double e = 1.0;
double term = 1.0;
for (int i = 1; i <= n; i++) {
term *= (1.0 / i);
e += term;
}
return e;
}
28.斐波那契数列问题。输入正整数n(1≤n≤46),输出斐波那契数列的前n项:1,1,2,3,5,8,13,...,每行输出8个。斐波那契数列就是满足任一项数字是前两项之和。
//斐波那契数列
#include<stdio.h>
int main(void){
int n,x1,x2,x;
printf("请输入一个1~46的正整数:");
scanf("%d",&n);
if(n<1||n>46){
printf("参数不合法!");
}else if(n==1){
printf("%d",1);
}else{
x1=1;
x2=1;//头两项都是1
printf("%5d%5d",x1,x2);
for(int i=3;i<=n;i++){
x=x1+x2;
printf("%5d",x);
if(i%8==0){//输出8个数据后换行
printf("\n");
}
x1=x2;
x2=x;
}
}
return 0;
}
29.素数问题。输入2个正整数m和n(1≤m≤n≤500),输出m到n之间的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。对m~n之间的每个数进行判断,若是素数,则输出该数。
//使用嵌套循环求m到n之间的全部素数
#include<stdio.h>
#include<math.h>
int main(void){
int count,k,flag,limit,m,n;//flag表示是否为素数
printf("请输入正整数m和n:");
scanf("%d%d",&m,&n);
count=0;//count记录素数的个数,用于控制输出格式
if(m<1||n>500||m>n){
printf("数据不合法!");
}else{
for(k=m;k<=n;k++){
if(k<=1){
flag=0;
}else if(k==2){
flag=1;
}else{
flag=1;
limit=sqrt(k)+1;
for(int i=2;i<=limit;i++){
if(k%i==0){
flag=0;
break;
}
}
}
if(flag==1){
printf("%6d",k);
count++;
if(count%10==0){
printf("\n");
}
}
}
}
return 0;
}
30.搬砖问题。某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块转,问有哪些搬法?
//n人正好搬n块转
#include<stdio.h>
int main(void){
int children,cnt,men,n,women;
printf("请输入一个正整数n:");
scanf("%d",&n);
cnt=0;
for(men=0;men<=n;men++){
for(women=0;women<=n;women++){
for(children=0;children<=n;children++){
if((men+women+children==n)&&men*3+women*2+children*0.5==n){
printf("男人%d人,女人%d人,小孩%d人\n",men,women,children);
cnt++;
}
}
}
}
if(cnt==0){
printf("无有效解");
}
return 0;
}
//n人正好搬n块转,优化版
#include<stdio.h>
int main(void){
int children,men,women,n;
int cnt=0;
printf("请输入一个正整数n:");
scanf("%d",&n);
float limit_men=n/3;
float limit_women=n/2;
for(men=0;men<=limit_men;men++){
for(women=0;women<=limit_women;women++){
children=n-men-women;
if(men*3+women*2+children*0.5==n){
printf("男人%d人,女人%d人,小孩%d人\n",men,women,children);
cnt++;
}
}
}
if(cnt==0){
printf("无有效解");
}
return 0;
}
31.找零钱问题。有足够数量的5分、2分和1分的硬币,现在要用这些硬币来支付一笔小于1元的零钱money,问至少要用多少个硬币?输入零钱,输出硬币的总数量和相应面额的硬币数量。
//找零钱问题。
#include<stdio.h>
int main(void){
int flag,n1,n2,n5,money;
//flag标识满足条件时中止循环,
//n1,n2,n5分别表示1分,2分,5分硬币的数量。
flag=1;
printf("请输入需要支付的费用(输入小数点后内容即可):");
scanf("%d",&money);
for(n5=money/5;(n5>=0&&(flag==1));n5--){
for((n2=money-n5*5)/2;(n2>=0)&&(flag==1);n2--){
for(n1=money-n5*5-n2*2;(n1>=0)&&(flag==1);n1--){
if((n5*5+n2*2+n1)==money){
printf("五分%d枚,两分%d枚,一分%d枚,总共%d枚",n5,n2,n1,n1+n2+n5);
flag=0;//置flag为0,则三重循环的条件都不满足,中止嵌套循环
}
}
}
}
return 0;
}
32.输出水仙花数。输入一个正整数n(3≤n≤7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。
#include <stdio.h>
#include <math.h>
int main() {
int n;
printf("请输入一个正整数n(3≤n≤7):");
scanf("%d", &n);
if (n < 3 || n > 7) {
printf("输入不在允许的范围内。\n");
return 1; // 返回错误代码
}
int start = pow(10, n - 1); // 计算起始值
int end = pow(10, n) - 1; // 计算结束值
for (int i = start; i <= end; i++) {
int num = i;
int sum = 0;
while (num > 0) {
int digit = num % 10;
sum += pow(digit, n);
num /= 10;
}
if (sum == i) {
printf("%d\n", i);
}
}
return 0;
}
模块化结构版本如下:
#include <stdio.h>
#include <math.h>
// 计算一个数字的幂次之和
int calculateSumOfPowers(int num, int n) {
int sum = 0;
while (num > 0) {
int digit = num % 10;
sum += pow(digit, n);
num /= 10;
}
return sum;
}
int main(void) {
int n;
printf("请输入一个正整数n(3≤n≤7):");
scanf("%d", &n);
if (n < 3 || n > 7) {
printf("输入不在允许的范围内。\n");
return 1; // 返回错误代码
}
int begin = pow(10, n - 1);
int end = pow(10, n) - 1;
for (int i = begin; i <= end; i++) {
int sum = calculateSumOfPowers(i, n);
if (sum == i) {
printf("%d ", i);
}
}
return 0;
}
33.使用函数判断完全平方数。定义一个判断完全平方数的函数IsSquare(n),当n为完全平方数时返回1,否则返回0,不允许调用数学库函数。当n是完全平方数时,n可以采用以下等差数列求和公式计算:
/*判断完全平方数*/
#include<stdio.h>
//判断完全平方数函数
int IsSquare(int n){
for(int i=1;n>0;i=i+2){
n=n-i;
}
if(n==0)
return 1;
else
return 0;
}
//主函数
int main(void){
int n;
int isSquare;
printf("请输入一个正整数n:");
scanf("%d",&n);
isSquare=IsSquare(n);
if(isSquare==1)
printf("%d是完全平方数!\n",n);
else
printf("%d不是完全平方数!\n",n);
return 0;
}
34.计算2个复数之和与之积。分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之积。
/*计算复数*/
#include<stdio.h>
double result_real,result_imag;//全局变量,用于存放函数结果
int main(void){
double imag1,imag2,real1,real2;
void complex_prod(double real1,double imag1,double real2,double imag2);
void complex_add(double real1,double imag1,double real2,double image2);
printf("请输入第一个复数(实部和虚部):");
scanf("%lf %lf",&real1,&imag1);
printf("请输入第二个复数(实部和虚部):");
scanf("%lf %lf",&real2,&imag2);
complex_add(real1,imag1,real2,imag2);//求复数之和
printf("两复数之和为:%.2f+%.2fi\n",result_real,result_imag);
complex_prod(real1,imag1,real2,imag2);//求复数之积
printf("两复数之积为:%.2f+%.2fi\n",result_real,result_imag);
return 0;
}
//定义复数求和函数
void complex_add(double real1,double imag1,double real2,double imag2){
result_real=real1+real2;
result_imag=imag1+imag2;
}
//定义复数求积函数
void complex_prod(double rea1,double imag1,double real2,double imag2){
result_real=rea1*real2-imag1*imag2;
result_imag=rea1*imag2+real2*imag1;
}
35.输入正整数n,输出1!~n!的值。要求定义并调用含静态变量的函数fact_s(n)计算n!。
#include<stdio.h>
double fact_s(int n);
int main(void){
int n;
printf("请输入一个正整数n:");
scanf("%d",&n);
for(int i=1;i<=n;i++){
printf("%3d!=%.0f\n",i,fact_s(i));
}
return 0;
}
double fact_s(int n){
static double f=1;
/*定义静态变量,存放在静态存储区,生存周期持续到程序结束,
一旦含有静态局部变量的函数被再次调用就会被重新激活,且保留
上次调用后的值*/
f=f*n;
return(f);
}
36.大小写英文字母转换。输入一行字符,将其中的大写字母转换为相应的小写字母后输出,大小写字母的判断和转换用else-if语句实现。
/*大小写英文字母转换*/
#include<stdio.h>
int main(void){
char ch;
printf("请输入一段字符:");
ch=getchar();
while(ch!='\n'){
if(ch>='A'&&ch<='Z'){
ch=ch-'A'+'a';
}else if(ch>='a'&&ch<='z'){
ch=ch-'a'+'A';
}
putchar(ch);
ch=getchar();
}
return 0;
}