c语言作业5
学校⾥的“吃货协会”准备搞⼀个聚会,已经知道现有会员 N ⼈,把会员从1 到 N编号,其中会⻓的号码是 N号,凡是和会⻓是⽼朋友的,那么该会员的号码肯定和N 有⼤于 1的公约数,否则都是新朋友。【提⽰2】编写 main 函数,接收键盘输⼊的 N 的值,寻找 [1,N-1] 区间内的与 N 的最⼤公约数为 1 的数字,输出个。有5个学⽣坐在⼀起,问第5个学⽣多少岁,他说⽐第4个学⽣⼤2岁。设⼈⺠币的
题⽬1
编写函数求次⽅。其中函数头为 double power(double x, int n) 。在主函数中输⼊ x 、n 并调⽤该函数求x*n。
#include <iostream>
using namespace std;
// 计算x的n次方的函数
double power(double x, int n) {
double result = 1.0;
// 处理n为正数的情况
for (int i = 0; i < n; i++) {
result *= x;
}
// 处理n为负数的情况(x的负n次方等于1除以x的正n次方)
for (int i = 0; i < -n; i++) {
result /= x;
}
return result;
}
int main() {
double x;
int n;
// 输入x和n
cout << "请输入底数 x: ";
cin >> x;
cout << "请输入指数 n: ";
cin >> n;
// 调用power函数并输出结果
double result = power(x, n);
cout << x << " 的 " << n << " 次方是: " << result << endl;
return 0;
}
输⼊⽰例(输⼊两个数,第⼀个为整数 n ,第⼆个为浮点数 x )
3 5
输出⽰例(输出 x 的 n 次⽅,保留两位⼩数):
125.00
题⽬2:
⽤递归函数的⽅法,求解题⽬1.
【提⽰:先列出具体的数学公式,找到对应的 base case , general case , 再套⽤模板。】
#include <stdio.h>
double power(double x, int n)//定义power函数
{
//base case
if(n==0)
{
return 1.00;
}
//general case
else if(n>0)//正指数情况
{
return x*power(x,n-1);//递归调用,将问题规模减小
}
else//负指数情况
{
return 1.00/power(x,-n);//将负指数转换为正指数来处理
}
}
int main()
{
int n;
double x,t;
scanf("%d%lf",&n,&x);
t=power(x, n);
printf("%.2lf\n", t);//题目要求保留2位小数
return 0;
}
输⼊⽰例1(说明:输⼊第⼀个为整数 n ,第⼆个为浮点数 x 。):
3 5
输出⽰例(输出 x 的 n 次⽅,保留两位⼩数):
125.00
题⽬3:
设⼈⺠币的⾯额有(以元为单位):1⾓、2⾓、5⾓、1元、2元、5元、10元、20元、50元。
编写函数 void change(double m,double c); 其中 m 为商品价格(只取⼀位有效数字), c 为顾客付款(只取⼀位有效数
字),函数能输出应给顾客找零⾦额的各种⾯额⼈⺠币的张数,且张数之和为最⼩。
要求在主函数中输⼊商品价格和顾客付款,调⽤函数得到结果。
#include <stdio.h>
#include <math.h>
void change(double m, double c)
{
int count,n;
int change=(c-m)*10;//零钱乘上10使变为整数防止精度问题
int face_valve[9]={500,200,100,50,20,10,5,2,1};//数组,面额以角为单位
for(int i=0;i<9;i++)
{
count=change/face_valve[i];//最多包含count张
n+=count;
change%=face_valve[i];
if(face_valve[i]>=10)//分元和角输出
{
printf("%d元:%d\n",face_valve[i]/10,count);
} else {
printf("%d角:%d\n",face_valve[i],count);
}
}
printf("-----\n找零%d张!\n",n);//打印结果
}
int main()
{
double m,c;
scanf("%lf%lf",&m,&c);
change(m,c);//引用chang函数
return 0;
}
输出⽰例1:
34.2 100
输出⽰例1:
50元:1
20元:0
10元:1
5元:1
2元:0
1元:0
5⾓:1
2⾓:1
1⾓:1
__
找零 6 张!
题⽬4:
学校⾥的“吃货协会”准备搞⼀个聚会,已经知道现有会员 N ⼈,把会员从1 到 N编号,其中会⻓的号码是 N号,凡是和会⻓是⽼朋友的,那么该会员的号码肯定和N 有⼤于 1的公约数,否则都是新朋友。
现在会⻓想知道究竟有⼏个新朋友?请你编程序帮会⻓计算出来。
【提⽰1】编写函数 int gcd(int a,int b) ,求 a 和 b的最⼤公约数。
【提⽰2】编写 main 函数,接收键盘输⼊的 N 的值,寻找 [1,N-1] 区间内的与 N 的最⼤公约数为 1 的数字,输出个
数。
💡 公约数,亦称“公因数”,是指能同时整除若⼲个整数的整数;其中最⼤的⼀个称为最⼤公约数。
12和15的公约数有1、3,其中最⼤公约数是3;
30和40的公约数有1、2、5、10,最⼤公约数是10;
3和4的公约数有1,最⼤公约数是1;
💡 求解⽅法:辗转相除法
【参考链接:https://blog.csdn.net/sjdgehi/article/details/148925793】
输⼊⽰例1( N ):
50
输出⽰例1( [1,N-1] 区间内的与N的最⼤公约数为 1 的数字个数):
20
#include <stdio.h>
#include <math.h>
int gcd(int a,int b)
{
int r;
while(b!=0)//直到余数为0,最终b即是r
{
r=a%b;
a=b;//将 b 和 r 作为新的两个整数
b=r;
}
return a;//返回最大公约数
}
int main()
{
int N,n=0,i;
scanf("%d",&N);
for(i=1;i<=N-1;i++)
{
if (gcd(i,N-1)==1)//1作为最大公约数
{
n++;
}
}
printf("%d\n",n);
return 0;
}
题⽬5:
要求:⽤递归函数判断⼀个⾃然数是否为素数(0表⽰不是,1表⽰是)。
💡 提⽰,判断范围: i <= sqrt(n)
输⼊⽰例1(⼀个⾃然数):
4
输出⽰例1(是否为素数( 0 表⽰不是, 1 表⽰是)):
0
#include <stdio.h>
#include <math.h>
int is_prime(int n,int i)
{
//base case
if(n<2)
{
return 0;
}
if(n==2)
{
return 1;
}
//general case
if(i>sqrt(n))//判断范围: i <= sqrt(n)
{
return 1;
}
if(n%i==0)
{
return 0;
}
return is_prime(n,i+1);
}
int main()
{ int num;
scanf("%d", &num);
printf("d\n",is_prime(num,2));
return 0;
}
题⽬6:
要求:⽤递归函数求解下⽅问题。
有5个学⽣坐在⼀起,问第5个学⽣多少岁,他说⽐第4个学⽣⼤2岁。问第4个学⽣岁数,他说⽐第3个学⽣⼤2
岁。问第3个学⽣岁数,他说⽐第2个学⽣⼤2岁。问第2个学⽣岁数,他说⽐第1个学⽣⼤2岁。最后问第1个学⽣,
他说10岁,请问第5个学⽣多⼤。。
输⼊⽰例1:
[⽆输⼊]
输出⽰例1(第 5 个学⽣的年龄):
18
#include <stdio.h>
#include <math.h>
int age(int n)
{
if(n==1)
{
return 10;
}
else
{
return age(n-1)+2;//第次-1,年龄+2
}
}
int main()
{
printf("%d\n",age(5));
return 0;
}
题⽬7:
编写函数,寻找300以内的所有的对称回⽂数并输出。
💡 回⽂数是指某数与其反序数相等,例如 5、131、1551、345676543。
对称回⽂数是指某数与其平⽅都是回⽂数。例如,n=11时,1111=121;n=111时,111111=12321。
【提⽰1】编写函数 int huiwen(long n) ,判断 n 是否回⽂数,若是返回 1 ,否则返回 0 。
【提⽰2】在 main 函数中遍历 300 以内的数,寻找对称回⽂数并输出。
输⼊⽰例:
[⽆输⼊]
输出⽰例:
300以内的所有的对称回⽂数: 1 2 3 11 22 101 111 121 202 212
/*
1,提取最后一位:任何数除以10的余数即为该数的最后一位数字
2,移除最后一位:任何数除以10的商即为去掉最后一位后的数字
3,反转数字:通过循环将原数的每一位数字按相反顺序重新组合成新数
4,比较判断:如果反转后的新数等于原数,则该数为回文数
*/
#include <stdio.h>
#include <math.h>
int huiwen(long n)
{
int a=0,b;
b=n;
while(b>0)
{
a=a*10+b%10;
b/=10;
if(a==n)
{
return 1;
}
}
return 0;//消除未定义行为,不然会出现10和100
}
int main()
{
printf("300以内的所有的对称回⽂数:");
for(long i=1;i<=300;i++)
{
long t=i*i;
if(huiwen(t)==1&&huiwen(i)==1)//同时满足某数与其平⽅都是回⽂数
{
printf("%d ",i);
}
}
return 0;
}
更多推荐

所有评论(0)