本文旨在积累分享学习C语言 [作者临时转战 C++了,所以后面的题可能会用 C++实现,大部分还是C ]过程中做的一些pat题目题解与反思,供自己后续对自己代码的复盘和积累(便捷win搜索ctrl+f直达对应题目)
浙大版《C语言程序设计(第3版)》题目集
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;
}
int max(int a,int b){
int Max = a;
int Min = b;
if (Min > Max){
Max = Min;
}
return Max;
}
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;
}
}
#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;
}
注意:每次输出的要求不同,需要找出空格和符号的规律,层层输出,特别是输出符号后是否有空格等细节,可能会影响输出结果,遇到最后一个没有空格,中间需要空格的可以在一行循环完单独打印出最后一个符号
#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);
}
- 练习2-10 计算分段函数[1]
注意:输入的是实数,所以直接用float类型定义,后续和1做运算,1就不需要变成1.0了
//“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;
}
- 习题2-6 求阶乘序列前N项和
套用练习2-18 求组合数中的求阶乘方法
#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;
}
- 练习3-4 统计字符
类似于习题 6-1,6-1我是数组相关方式实现,这次用字符相关方式实现,逻辑等基本一致
#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;
}
- 练习4-7 求e的近似值
套用习题2-6 求阶乘序列前N项和练习2-18 求组合数中的求阶乘方法
#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);
}
- 练习4-11 统计素数并求和
步骤参考习题5-4
#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
菜鸡学习积累,如果错误欢迎大佬指正