PAT练习积累【暂停更新】

本文旨在积累分享学习C语言 [作者临时转战 C++了,所以后面的题可能会用 C++实现,大部分还是C ]过程中做的一些pat题目题解与反思,供自己后续对自己代码的复盘和积累(便捷win搜索ctrl+f直达对应题目)


浙大版《C语言程序设计(第3版)》题目集
  1. 练习5-1 求m到n之和
int sum( int m, int n ){
    int a = m;
    int b = n;
    int result = 0;
    for(int i = m; i <= n; i++){
        result += i;
    }
    return result;
}

  1. 练习5-2 找两个数中最大者
int max(int a,int b){
    int Max = a;
    int Min = b;
    if (Min > Max){
        Max = Min;
    }
    return Max;
}

  1. 练习5-3 数字金字塔
void pyramid( int n ){
    int i = 1;	/* 列 */
	int j = 0;  /* 行 */
    int k = 0;  /* 数值输出次数 */
    for (j = 0; j < n; j++){
    	/* 打印空格个数 */
    	while(i < n-j) {
    		printf(" ");
    		i++;
		}
		/* 打印数值 */
		while(k <= j){
			printf("%d ",j+1);
			k++;
		}
		printf("\n");
		i = 1;
		k = 0;
	}
}

  1. 练习2-3 输出倒三角图案
#include <stdio.h>
#define num 4 
int main(){
    int i = 0;	/* 列 */
	int j = 0;  /* 行 */
    int k = num-1;  /* 星号输出次数 */
    for (j = 0; j < num; j++){
    	/* 打印空格个数 */
    	while(j > i) {
    		printf(" ");
    		i++;
		}
		/* 打印星号 */
		while(k > j){
			printf("* ");
			k--;
		}
        printf("*");
		printf("\n");
		i = 0;
		k = num-1;
	}
}

直接输出:

#include<stdio.h>
int main()
{
    printf("* * * *\n * * *\n  * *\n   *\n");
    return 0;
}

注意:每次输出的要求不同,需要找出空格和符号的规律,层层输出,特别是输出符号后是否有空格等细节,可能会影响输出结果,遇到最后一个没有空格,中间需要空格的可以在一行循环完单独打印出最后一个符号


  1. 练习2-4 温度转换
#include <stdio.h>
int main(){
    int fahr = 150;
    int celsius = 5.0*(fahr-32)/9.0;
    printf("fahr = %d, celsius = %d",fahr,celsius);
}

21.3.21 mark


int sign( int x ){
    if(x == 0){      //注意这里要用'=='关系运算符,而'='是赋值符号
        return 0;
    } else if(x > 0){
        return 1;
    } else {
        return -1;
    }
}

//当n为偶数时返回1,否则返回0
int even( int n ){
    int num = n;
    if(num%2 == 0){
        return 1;
    }else{
        return 0;
    }
}

//计算并返回传入的N个整数List[]中所有奇数的和
int OddSum( int List[], int N ){
    int i = 0;
    int sum = 0;
    for(i = 0;i < N;i++){
        if (even(List[i]) == 0){
            sum += List[i];
        }
    }
    return sum;
}

double dist( double x1, double y1, double x2, double y2 ){
    float dis;
    dis = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
    return dis;
}

  • 习题5-4 使用函数求素数和
    这里判断是否是素数最直接的暴力办法可以写一个for把2~p之间的数都除一下,都不能被整除就是素数;也可以简化只要不能被 2~ sqrt ( p )之前的整数除就可以,因为如果是可以整除的中间会有重复证明的部分。
//当用户传入参数p为素数时返回1,否则返回0;
int prime( int p ){
    int i = 2;
    //p为1或2的时候单独考虑
    if(p<= 1)
        return 0;
    if(p == 2)
        return 1;
    if(p%2 == 0)
        return 0;
    int limit = (int)sqrt((double)p);
    for(int i = 3; i <= limit; i=i+2) {
        if(p % i == 0)
            return 0;
    }
    return 1;
}
//返回区间[m, n]内所有素数的和
int PrimeSum( int m, int n ){
    int j = m;
    int sum = 0;
    for(j = m; j <= n; j++){
        if( prime(j) == 1){
            sum += j;
        }
    }
    return sum;
}

21.3.23 mark


#include <stdio.h>
int main(){
    printf("height = %.2f\n",10.0*3*3/2);
    //此处如果直接用10进行运算只能得到0,通常需要保留小数时,须将其中一个除数转换为浮点数
}

#include <stdio.h>
int main(){
    int f = 0;
    scanf("%d", &f);
    printf("Celsius = %d",5*(f - 32)/9);
    
}

#include <stdio.h>
int main(){
    int a = 0,b = 0;
    scanf("%d %d",&a,&b);
    //注意输出的格式以及换行
    printf("%d + %d = %d\n", a, b, a+b);
    printf("%d - %d = %d\n", a, b, a-b);
    printf("%d * %d = %d\n", a, b, a*b);
    printf("%d / %d = %d", a, b, a/b);
}


//“f(x) = result”的格式输出,其中x与result都保留一位小数
#include <stdio.h>
int main(){
    float num;
    scanf("%f",&num);
    if(num == 0.0){
        printf("f(%.1f) = 0.0", num);
    } else {
        printf("f(%.1f) = %.1f", num,1/num);
    }
}

21.3.24 mark


#include <stdio.h>
#include <math.h>
int main() {
    float num,res;
    scanf("%f",&num);
    if (num < 0){
        res = pow((num+1), 2) + 2*num + 1/num;
    } else {
        res = pow(num, 0.5);
    }
    printf("f(%.2f) = %.2f",num,res);
}

#include <stdio.h>
int main(){
    int f = 0;
	float c;
	int lower = 0, upper = 0;
    scanf("%d %d", &lower, &upper);
    if(lower > upper){
    	printf("Invalid.");
	} else{
		printf("fahr celsius\n");
		for(f = lower; f <= upper; f += 2){
		//注意这里可以等于upper,f以间隔2递增
			c = 5.0*(f - 32)/9;
			//注意整数运算需将其中一个整数加一个小数点使运算得到浮点数
    		printf("%d%6.1f\n",f,c);	
    		//右对齐正常输出即可,左对齐%后面加'-',此处两个数值之间不要在空格,否则输出会多一个空格
		}
	}
}

int CountDigit( int number, int digit ){
    int num;
    //为方便后面取%10的值和digit进行比较,这里先都化为正数
    if(number >= 0){
        num = number;
    } else {
        num = -1*number;
    }
	int dig = num%10;
    int tot = 0;
    if(num == 0){  //如果num等于0,直接输出1即可
        return 1;
    }
	while(num != 0){  //如果num不等于0,进行循环得到每一位的值并比较,满足条件的计数加一
		if(dig == digit){
            tot+=1;
        }
		num /= 10;
		dig = num%10;	
	}
    return tot;
}

21.3.25 mark


#include <math.h>
//函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。 
int narcissistic( int number ){
	int num1 = number;    //用来得到传入值是几位数
	int num2 = number;    //用来计算每一位n次幂的和
	int sum = 0;          //记录n次幂的和
	int len = 0;          //记录几位数 
	while(num1){
        len++;
        num1 /= 10;
    } 
    int n = len;  //n位数 ~ n次幂
	while (len){
		sum += pow(num2%10,n);		//得到每一位n次幂的和
		num2 /= 10;					//去掉已经算过的最后一位
		len--;
	}
	if (sum == number){             //比较n次幂和该数数值
		return 1;
	} else {
		return 0;
	}
} 

//打印开区间(m, n)内所有的水仙花数,每个数字占一行
void PrintN( int m, int n ){
	    for (int i = m+1; i < n; i++){  //注意开区间不包括两端点值
        if(narcissistic(i) == 1){
            printf("%d\n",i);
        }
    }
}


void StringCount( char s[] ) {
    int let = 0, bla = 0, dig = 0, oth = 0;
    for(int i = 0; s[i] != NULL; i++){
		if((s[i]>='a'&&s[i]<='z') || (s[i]>='A'&&s[i]<='Z')){  //判断是否是字符
			let++;
		}
		else if(s[i]>='0' && s[i]<='9'){                       //判断是否是数字
			dig++;
		}
		else if(s[i]==' ' || s[i]=='\n'){                      //判断是否是空格
			bla++;
		}
		else{
			oth++;
		}	
	}
    printf("letter = %d, blank = %d, digit = %d, other = %d",let,bla,dig,oth);
}

21.3.31 mark


#include <math.h>
int fn( int a, int n ){
    int total = 0;
    for(int i = 0; i < n; i++){
        total += a*pow(10,i);
    }
    return total;
}
int SumA( int a, int n ){
    int sum = 0;
    for(int j = 1; j <= n; j++){ //注意从1开始算,算到n,而不是从0到n-1
        sum += fn(a,j);			 //用上面的函数外加循环来递归求解
    }
    return sum;
}

// factorsum须返回int number的因子和,没有就return 0
int factorsum( int number ){
	int i = 0;
    int sum = 0;            //number的因子和
	if(number == 1){        //1单独考虑,只有一个因子,直接输出
		return 0;
	}
	for(i = 1; i < number; i++){    //除数不为0,从1开始(所以1单独考虑)
		if(number%i == 0){
			sum += i;       //能整除的是因子并计算因子和
		}
	}
	if(sum == number){      //是完数输出结果
		return sum;
    } else {
        return 0;           //不是完数return 0
    }
}
/*
函数PrintPN要逐行输出给定范围[m, n]内每个完数的因子累加形式的分解式,
每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”
其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。
*/
void PrintPN( int m, int n ){
    int flag = 0;						  //判断范围内是否有完数
    for(int i = m; i <= n; i++){
        int sum = 0;
        if(factorsum(i) != 0){			  //因数和不为0来判断是否需要继续以下步骤,为0直接往后继续循环
            printf("%d = ",i);
            for(int j = 1; j < i; j++){   //类似上面的函数求和
                if(i%j == 0){
                    printf("%d",j);       //输出因子
                    flag = 1;			  //记录有完数
                    sum += j;			  
                    if(sum != i){		  //通过求和结果来判断是否后面要加“+”号
                        printf(" + ");
                    }
                }
            }
            printf("\n");
        }
    }
    if(flag == 0){						  //没有完数
        printf("No perfect number");
    }
}

#include <stdio.h>
int main(){
    double sum;
    int n = 0;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){	//注意除数不为0,从1 开始
        sum += 1.0/i;
    }
    printf("sum = %.6f",sum);
}

#include <stdio.h>
int main(){
    double sum;
    int n = 0;
    scanf("%d",&n);
    for(int i = 1; i <= (2*n-1) ; i += 2){   //基本思路和上一题类似,改一下范围和i每次的增幅
        sum += 1.0/i;
    }
    printf("sum = %.6f",sum);
}

#include <stdio.h>
#include <math.h>
int main(){
    double sum;
    int n = 0,sign = 0;
    scanf("%d",&n);
    for(int i = 1; i <= (3*n-2) ; i += 3){
        if(i%2 == 0){
            sign = -1.0;
        } else {
            sign = 1.0;
        }
        //if语句用来判断符号,也可以直接去掉然后下面的语句替换成注释中的句子,也可以简便判断
        //sum += -1.0/i*pow(-1.0,i%2);
        sum += 1.0/i*sign;
    }
    printf("sum = %.3f",sum);
}

21.4.1 mark


  • 练习2-17 生成3的乘方表
    本题值得注意的是按下面这样写是过了的,但是实际上严谨来说,C 库函数 double pow(double x, double y) ,是double类型,其中应该替换成注释里的语句更为严谨
#include <stdio.h>
#include <math.h>
int main(){
    int num = 0;
    int res;
    //double res;
    scanf("%d",&num);
    for(int i = 0; i <= num; i++){
        res = pow(3,i);
        printf("pow(3,%d) = %d\n",i,res);
        //printf("pow(3,%d) = %.0f\n",i,res);  确保输出的值无小数
    }
    return 0;
}

#include <stdio.h>
double fact(int n){
    double sum = 1;   //注意这里不要初始化为0了,后面需要直接做乘法运算
    for(int i = 1; i <= n; i++){   //循环算阶乘
        sum *= i;
    }
    return sum;
}

int main(){
    int m ,n;
    scanf("%d %d",&m,&n);
    double res;
    res = fact(n)/(fact(m)*fact(n-m));  //分母用括号结合先进行计算,否则可能会出结果不符问题
    printf("result = %.0f\n",res);
    return 0;
}

#include <stdio.h>
int main(){
    int a , b, c, d;
    scanf("%d %d %d %d",&a,&b,&c,&d);
    int sum = 0;
    float avrg;
    sum = a + b + c + d;
    avrg = sum / 4.0;
    printf("Sum = %d; Average = %.1f",sum,avrg);
    return 0;
}

#include <stdio.h>
int main(){
    int hour;
    float total;
    scanf("%d",&hour);
    if(hour < 0){
        printf("Invalid Value!");
        return 0;
    } else if(hour <= 50){
        total = hour*0.53;
    } else {
        total = 50*0.53+(hour - 50)*0.58;
    }
//     结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"
    printf("cost = %.2f",total);
    return 0;
}

#include <stdio.h>
int main(){
    int m = 0, n = 0;
    float sum;
    scanf("%d %d",&m, &n);
    for(int i = m; i <= n; i++){
        sum += pow(i,2)+1.0/i;
    }
    printf("sum = %.6f",sum);
    return 0;
}

21.4.2 mark


#include <stdio.h>
#include <math.h>
int main(){
    float sum;
    int num = 0;
    scanf("%d",&num);
    for(int i = 1; i <= num; i++){
        sum += -1.0*i/(2*i-1)*pow(-1,i);
    }
    printf("%.3f",sum);
    return 0;
}

#include <stdio.h>
#include <math.h>
int main(){
    double sum;
    int num = 0;
    scanf("%d",&num);
    for(int i = 1; i <= num; i++){
        sum += sqrt(i);
    }
    printf("sum = %.2f",sum);
    return 0;
}

#include <stdio.h>
#include <math.h>
double fact(int n){
    double sum = 1;   //注意这里不要初始化为0了,后面需要直接做乘法运算
    for(int i = 1; i <= n; i++){   //循环算阶乘
        sum *= i;
    }
    return sum;
}

int main(){
    int sum;
    int num = 0;
    scanf("%d",&num);
    for(int i = 1; i <= num; i++){
        sum += fact(i);
    }
    printf("%d",sum);
    return 0;
}

#include <stdio.h>
int main(){
    int num = 0;
    int sign = 0;
    scanf("%d",&num);
    if(num < 0){
        sign = -1;
    } else if (num == 0){
        sign = 0;
    } else {
        sign = 1;
    }
    printf("sign(%d) = %d",num,sign);
    return 0;
}

#include <stdio.h>
int main(){
    int num = 0;
    int count = 0, sum = 0;
	float avrg;
    int score = 0;
    scanf("%d",&num);
    if(num == 0){		//注意分母不为0,单独考虑num=0
        avrg = 0.0;     //注意输出格式
        count = 0;
    } else {
        for(int i = 0; i < num; i++){
            scanf("%d",&score);
            sum += score;
            if(score >= 60){
                count++;
            }
        }
        avrg = 1.0*sum/num;
    }
    printf("average = %.1f\n",avrg);
    printf("count = %d",count);
    return 0;
}

#include <stdio.h>
#include <math.h>
 
int main(){	
	char ch;
	int let = 0, bla = 0, dig = 0, oth = 0;
    for(int i = 1; i <= 10; i++){
        ch = getchar();
		if((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')){  //判断是否是字符
			let++;
		}
		else if(ch>='0' && ch<='9'){                       //判断是否是数字
			dig++;
		}
		else if(ch==' ' || ch=='\n'){                      //判断是否是空格
			bla++;
		}
		else{
			oth++;
		}	
	}
	printf("letter = %d, blank = %d, digit = %d, other = %d",let, bla, dig, oth);
    return 0;
}
 

21.4.3 mark


#include <stdio.h>
int main(){
    int year = 0;
    int flag = 0;   //标记是否有闰年
	scanf("%d", &year);
    if(year<=2000 || year>2100){
        printf("Invalid year!\n");
    } else {
        for(int i = 2001; i <= year; i++){
            if(i%4==0 && (i%100!=0 || i%400==0)){
                printf("%d\n", i);
                flag = 1;
            }
        }
        if(flag == 0){
            printf("None");
        }
    }
    return 0;
}

  • 练习3-7 成绩转换
    注意:switch 语句只能够测试是否相等,因此,case 语句后面只能是整型或字符型的常量或常量表达式;而在 if 语句中还能够测试关系与逻辑表达式。本题选用的是 if- else 写法,后面习题3-4 统计学生成绩采用的是switch - case写法
#include <stdio.h>
int main(){
    int score = 0;
    scanf("%d",&score);
        // 大于等于90分为A;
    if(score >= 90){
        printf("A");
    } else if(score >= 80 && score < 90){
    // 小于90且大于等于80为B;
        printf("B");
    } else if(score >= 70 && score < 80){
    // 小于80且大于等于70为C;
        printf("C");
    } else if(score >= 60 && score < 70){
    // 小于70且大于等于60为D;
        printf("D");
    } else {
    // 小于60为E。
        printf("E");
    }
    return 0;
}

#include <stdio.h>
int main(){
    int opt = 0;
    printf("[1] apple\n[2] pear\n[3] orange\n[4] grape\n[0] exit\n");
    //当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0
    for(int i = 0; i < 5; i++){   //限制最多循环5次自动结束
        scanf("%d",&opt);
        switch(opt){
            case 0:
                return 0;		  //直接跳出循环
            case 1:
                printf("price = 3.00\n");
                break;
            case 2:
                printf("price = 2.50\n");
                break;
            case 3:
                printf("price = 4.10\n");
                break;
            case 4:
                printf("price = 10.20\n");
                break;
            default:
                printf("price = 0.00\n");
                break;
        }
    }
    return 0;
}

  • 习题3-1 比较大小
    也可以直接写一个判断两数较大数的函数,然后对三个数两两带入即可推出大小关系并赋值按顺序输出即可
#include <stdio.h>
int main(){
    int min = 0, med = 0, max = 0, temp = 0;
    scanf("%d %d %d", &min, &med, &max);
    if(min > med){
        temp = min;
        min = med;
        med = temp;
    }
    if(min > max){
        temp = min;
        min = max;
        max = temp;
    }
    if(med > max){
        temp = med;
        med = max;
        max = temp;
    }
    printf("%d->%d->%d", min, med, max);
    return 0;
}

21.4.5 mark


//达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证
#include <stdio.h>
int main(){
    int speed = 0, limit = 0;
    scanf("%d %d", &speed, &limit);
    float over =  (speed - limit) * 100.0 / limit;
    if(over < 10){
        printf("OK");
    } else if (over >= 10 && over < 50){
        printf("Exceed %.0f%%. Ticket 200",over);
    } else {
        printf("Exceed %.0f%%. License Revoked",over);
    }
}

#include <stdio.h>
int main(){
    float dis, fare;
    int time = 0;
    scanf("%f %d", &dis, &time);
    // 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)
    if(time >= 5){
        fare += time/5*2;
    }
    //起步里程为3公里,起步费10元;
    if(dis <= 3){
        fare += 10;
    } else if (dis > 3 && dis <= 10){// 超起步里程后10公里内,每公里2元;
        fare += 10 + (dis-3)*2;
    } else {// 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
        fare += 10 + (10 - 3)*2 + (dis - 10)*3;
    }
    printf("%.0f",fare);  //默认四舍五入
    return 0;
}

  • 习题3-4 统计学生成绩
    之前练习3-7 成绩转换 使用的是if- else 写法,本体采用先对成绩 / 10处理再用switch -case 方式实现。
#include<stdio.h>
int main(){
	int num;
    int a = 0, b = 0, c = 0, d = 0, e = 0;
	int score = 0;
	scanf("%d",&num);
	for(int i = 1; i <= num; i++){
		scanf("%d",&score);
		switch(score / 10){
			case 10:
			case 9:a++;
			continue;
			case 8:b++;
			continue;
			case 7:c++;
			continue;
			case 6:d++;
			continue;
			default :e++;
			continue;
		}
	}
    printf("%d %d %d %d %d",a,b,c,d,e);
}

21.4.6 mark


#include <stdio.h>
#include <math.h>

int main() {
	double x1,y1,x2,y2,x3,y3;
	double a,b,c,L,A;
	scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
	a = sqrt(pow((x1-x2),2) + pow((y1-y2),2));
	b = sqrt(pow((x1-x3),2) + pow((y1-y3),2));
	c = sqrt(pow((x3-x2),2) + pow((y3-y2),2));
	if((a+b)<=c || (a+c)<=b || (c+b)<=a){
		printf("Impossible");
	}else{
		L = a + b + c;
 		A = sqrt(0.5*L*(0.5*L-a) * (0.5*L-c)*(0.5*L-b));
 		printf("L = %.2f, A = %.2f",L,A ); 
 	}
    return 0;
}

#include<stdio.h>
#include<math.h>

int main(){
	double esp, item, sum;
	scanf("%lf", &esp);
	int n = 1;
	sum=0;
	item=1.0;
	//给出的esp大于或者等于首项,直接输出第一项
    if (fabs(item) < esp || fabs(item) == esp){
        sum += item;
    }
	while(fabs(item) > esp) {
		item = -1.0 * pow(-1,n) / (3*n - 2);
		sum += item;
        n++;
	}
	printf("sum = %.6f\n", sum);
	return 0;
 } 

#include<stdio.h>

int main(){
    int key = 0, time = 0, flag = 0, num = 0; 
    //分别表示:答案 次数 是否n次内猜对标记 用户输入数字
    scanf("%d %d", &key, &time);
    for(int i = 0; ; i++){
        scanf("%d", &num);
        if(num < 0){
            printf("Game Over");
            break;
        } else if (num > key){
            printf("Too big\n");
        } else if (num < key){
            printf("Too small\n");
        } else if (num == key && i < 1){
            printf("Bingo!\n");
            flag = 1;
            break;
        } else if (num == key && i < 3){
            printf("Lucky You!\n");
            flag = 1;
            break;
        } else if (num == key && i < time){
            printf("Good Guess!\n");
            flag = 1;
            break;
        }
    }
    if(flag = 0){
        printf("Game Over");
    }
    return 0;
 } 

#include <stdio.h>
#include <math.h>
double fact(int n){
    double sum = 1;   //注意这里不要初始化为0了,后面需要直接做乘法运算
    for(int i = 1; i <= n; i++){   //循环算阶乘
        sum *= i;
    }
    return sum;
}

int main(){
    double sum;
    int num = 0;
    scanf("%d",&num);
    for(int i = 1; i <= num; i++){
        sum += 1/fact(i);
    }
    sum += 1;
    printf("%.8lf",sum);  //注意double输出用lf
    return 0;
}

21.4.7 mark


#include <stdio.h>
int main(){
    int n = 0, min = 0, num = 0;
    scanf("%d",&n);
    scanf("%d",&min);
    /*  先把第一个当作最小值,如果只有一个数就不需要进行比较,
    否则剩下数字通过循环读取并与第一个数进行比较,较小的赋值给min */
    for(int i = 1; i < n; i++){
        scanf("%d",&num);
        if(num < min){
            min = num;
        }
    }
    printf("min = %d", min);
}

#include <stdio.h>
int main(){
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("%d\n", PrimeSum(m, n));

    return 0;
}
//当用户传入参数p为素数时返回1,否则返回0;
int prime( int p ){
    int i = 2;
    //p为1或2的时候单独考虑
    if(p<= 1)
        return 0;
    if(p == 2)
        return 1;
    if(p%2 == 0)
        return 0;
    int limit = (int)sqrt((double)p);
    for(int i = 3; i <= limit; i=i+2) {
        if(p % i == 0)
            return 0;
    }
    return 1;
}
//返回区间[m, n]内所有素数的和
int PrimeSum( int m, int n ){
    int j = m;
    int sum = 0;
    int count = 0;
    for(j = m; j <= n; j++){
        if( prime(j) == 1){
            sum += j;
            count++;
        }
    }
    printf("%d ",count);
    return sum;
}

#include <stdio.h>
int main(){
    int num = 0, sum = 0;
    while(1){	//不知道循环测次数用while循环更方便
        scanf("%d",&num);
        if(num == 0 || num < 0){
            break;
        } else if(num %2 != 0){
            sum += num;
        }
    }
    printf("%d",sum);
}

#include<stdio.h>
#define eps 0.00001
int main(){
	double x = 0, sum = 1, result = 1;
	scanf("%lf", &x);
	for (int i = 1;; i++){
		result = result*(x / i);
		sum += result;
		if (result < eps){
			break;
		}
	}
	printf("%.4f\n", sum);
	return 0;
}

  • 习题4-3 求分数序列前N项和
    注意:代码中涉及到小数的变量不能设为int型,否则计算中会按照整数进行计算,导致小数位丢失,结果错误。
#include <stdio.h>
int main(){
    double sum = 0;
    int num = 0;
    double numer = 2, denomin = 1, temp = 0;  //分子分母
    scanf("%d", &num);
    for(int i = 0; i < num; i++){
        sum += numer / denomin;
        temp = numer;
        numer = numer + denomin;
        denomin = temp;
    }
    printf("%.2lf",sum);
}

21.4.8 mark


#include <stdio.h>
#include <math.h>

int Num(int a,int n){
    int num = 0;
    for(int i = 0; i < n; i++){
        num += pow(10,i) * a;
    }
    return num;
}

int main(){
    int a = 0, n = 0, s = 0;
    scanf("%d %d", &a, &n);
    for(int j = 0; j <= n; j++){	//注意此处需要等式保证可以循环到n个a组成的数求和
        s += Num(a,j);
    }
    printf("s = %d",s);
}

#include <stdio.h>

int main(){
    int money = 0;
    int total = 0, count = 0, fen5 = 0, fen2 = 0, fen1 = 0;
    int i = 0;
    scanf("%d", &money);
    money -= 5 + 2 + 1;
    //由于要求每个硬币都至少有一个,所以在计算就先除掉了基本的硬币价值,这样后面输出硬币个数时需要加一
    //如果这里不除去,则每个循环条件第二项需要改为 >=1 即可
    fen5 = money / 5;
    for(int i = fen5; i >= 0; i--){
        fen2 = (money - 5*i) / 2;
        for(int j = fen2; j >= 0; j--){
			printf("fen5:%d, ",i+1);	
			//注意这里打印fen5的位置,如果放在第一个循环里,后面讨论fen2的情况的时候,fen5这一项就不会被再次打印出来
			printf("fen2:%d, ",j+1);
            fen1 = money - 5*i - 2*j;
            for(int k = fen1; k >= 0; k--){
                if(k + 5*i + 2*j == money){		
                //注意这里需要加条件判断来决定最后有几个1分的硬币,如果不加判断将会输出各种情况
                    printf("fen1:%d, ",k+1);
                	printf("total:%d\n", i+j+k+3);
                	count++;
                }
            }
        }
    }
    printf("count = %d", count);
}

21.4.11 mark


菜鸡学习积累,如果错误欢迎大佬指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值