函数题
1分段函数1(函数)
double Fen1(double x){
if(x>1)return 5*x;
else if(x<-1)return x/2;
else return 2*x;
}
2用多项式来近似表示余弦函数cosx
double fact(int n){
double t=1.0;
for(int i=2;i<=n;i++)
t*=i;
return t;
}
double MyCos(double x,double epsilon){
int flag=1;
double result=0.0000000000000000000000000000000;
for(int i=1;pow(x,2*i-2)*flag/fact(2.0*i-2)>=epsilon||pow(x,2*i-2)*flag/fact(2*i-2)<=-epsilon;i++){
result+=pow(x,2*i-2)*flag/fact(2.0*i-2);
flag=-flag;
}
return result;
}
3求中位数
float fun(float a[],int n){
for(int i=1;i<n-1;i++){
for(int j=1;j<n-1;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
if(n%2==1)return a[n/2];
else return (a[n/2-1]+a[n/2])/2;
}
4求整数各位数字之和
int sumDigits(int n){
if(n<0)n=-n;
int sum=0;
while(n!=0){
sum+=n%10;
n/=10;
}
return sum;
}
5日期 - 10. 输出月份名(英文版)
void ShowNameMonthUsa(int month){
char*m[12]={"January","February","March","April",
"May","June","July","August","September",
"October","November","December"
};
if(month>=1&&month<=12){
printf("%s",m[month-1]);
}
}
6歌唱比赛打分
double getScore(int *score, int total){
if(total<3||total>20){
return -1;
}
int max=score[0];
int min=score[0];
int sum=score[0];
for(int i=1;i<total;i++){
if((score[i]>max)){
max=score[i];
}
if(min>score[i]){
min=score[i];
}
sum+=score[i];
}
double average=(double)(sum-max-min)/(total-2);
return average;
}
7统计字符串中数字字符的个数
int DigitalStatistics(char *p){
int count=0;
int len=strlen(p);
for(int i=0;i<len;i++){
if(p[i]>='0'&&p[i]<='9'){
count++;
}
}
return count;
}
8显示空心直角三角形(嵌套循环版)
void UpLfTrgHollow(int height, char symbol) {
int i, j;
// 使用循环结构来替代main函数中的if语句
for (i = height > 0 ? 1 : 0; i <= height; ++i) {
for (j = 1; j <= i; ++j) {
printf("%c", (i == 1 || i == height || j == 1 || j == i) ? symbol : ' ');
}
printf("\n");
}
}
9判断元音字母
int IsVowel(char x) {
return (x == 'A' || x == 'E' || x == 'I' || x == 'O' || x == 'U'||x=='a' || x=='e' || x=='i' || x=='o')||x=='u';
}
10简单计算x的n次方(递归完成)
int mypow ( int x,int n ){
if(n==0)return 1;
else if(n>0)return pow(x,n);
else return 1/pow(x,-n);
}
11寻找最大因子
int maxFactor(int num){
if(num<=1)return -1;
for(int i=num-1;i>=0;i--){
if(num%i==0){
return i;
}
}
}
12等腰梯形(下)(循环)
void DnTrp(int width, int height, char symbol){
if(width>=2*height-1){
for(int i=1;i<=height;i++){
Show(i-1,' ');
Show(width,symbol);
printf("\n");
width-=2;
}
}
}
13最大公约数(循环)
int Gcd(int x, int y){
if(x==0&&y==0)return 1;
while(y!=0){
int temp=y;
y=x%y;
x=temp;
}
return x;
}
14使用函数记账
void income(double cash){
balance+=cash;
}
void expend(double cash){
balance-=cash;
}
15连接字符串(排除相同的字符)
void strDifcat(char *dst,char *src){
int len1=strlen(dst);
int len2=strlen(src);
int i=0,j=0,k=len1;
for( ;i<len2;i++){
for(j=0;j<len1;j++){
if(src[i]==dst[j])break;
}
if(j==len1)dst[k++]=src[i];
}
dst[k]='\0';
}
16字符串逆置
void StrReverse ( char str[] ){
int len=strlen(str);
for(int i=0;i<len/2;i++){
char temp=str[i];
str[i]=str[len-1-i];
str[len-1-i]=temp;
}
}
17求字符串中整数字符之和
int sumOfDigit (char *s ){
int len=strlen(s);
int sum=0;
for(int i=0;i<len;i++){
if(s[i]>='0'&&s[i]<='9'){
sum+=s[i]-'0';
}
}
return sum;
}
18分段函数计算2
if(x<1)return pow(5,x);
else return pow(x,5);
编程题
7-1 sdut-C语言实验-选票统计
某校学生会主席由全校学生投票选举产生,共有m名候选人报名参选,编号为1到m(0<m<1000),全校有n名学生(0<n<30000),每人都可以投票。但每人只能投一票,每票只能选1名候选人。请你设计一个程序能够统计出哪个候选人得票最高,得了多少票。不会出现得票数相同的情况。
输入格式:
第一行输入候选人数m和学生数n,以空格分开;
下面依次输入每个学生所选的候选人的编号。
输出格式:
第一行输出得票最多的候选人编号;
第二行输出该候选人所得的票数。
输入样例:
3 10
1 2 3 2 3 1 2 3 1 3
输出样例:
3
4
#include<stdio.h>
int main(){
int m,n;
scanf("%d%d",&m,&n);
int str[m];
for(int i=0;i<m;i++){
str[i]=0;
}
int t;
for(int i=0;i<n;i++){
scanf("%d",&t);
if(t>=1&&t<=m){
str[t-1]++;
}
}
int maxvote=0;
int winner;
for(int i=0;i<m;i++){
if(maxvote<str[i]){
maxvote=str[i];
winner=i+1;
}
}
printf("%d\n%d",winner,maxvote);
}
7-2 学生信息的输入输出与求各门课的总分
用数据结构定义学生信息学号、姓名、5门课程的成绩,编一程序,输入n(n<=100)个学生成绩,求出总分最高的学生姓名并输出结果。要求编写3个函数,它们的功能分别为:
① 输入函数,用于从键盘读入学号、姓名和五门课的成绩;学号和成绩使用int型,姓名长度不超过10个字符。
② 计算总分函数,以计算每位学生的总分;
③ 输出函数,显示每位学生的学号、总分和分数;
说明:这三个函数的形式参数均为结构体指针和整型变量,函数的类型均为void。
输入格式:
第一行输入学生的个数n
从第二行开始每一行输入一个学生的信息:学号、姓名、5门课程的成绩。
输出格式:
每一行输出每一个同学的学号、姓名、5门课的成绩及总分。每一个同学的成绩输出完毕后换行。
其中:学号占5个字符位置,姓名占10个字符位置,每门课占5个字符位置,总分占10个字符位置,均右对齐。
输入样例:
在这里给出一组输入。例如:
3
001 zhang 50 60 70 80 90
002 li 60 70 60 70 80
003 wang 70 75 80 85 90
输出样例:
在这里给出相应的输出。例如:
1 zhang 50 60 70 80 90 350
2 li 60 70 60 70 80 340
3 wang 70 75 80 85 90 400
#include <stdio.h>
#include <string.h>
// 定义结构体
struct student {
int id;
char name[11];
int score[5];
int total;
};
// 输入函数
void input(struct student *s, int n) {
for (int i = 0; i < n; i++) {
scanf("%d", &s[i].id);
scanf("%s", s[i].name);
for (int j = 0; j < 5; j++) {
scanf("%d", &s[i].score[j]);
}
}
}
// 计算总分函数
void calculateTotal(struct student *s, int n) {
for (int i = 0; i < n; i++) {
s[i].total = 0;
for (int j = 0; j < 5; j++) {
s[i].total+=s[i].score[j];
}
}
}
// 输出函数
void output(struct student *s, int n) {
for (int i = 0; i < n; i++) {
printf("%5d", s[i].id);
printf("%10s", s[i].name);
for (int j = 0; j < 5; j++) {
printf("%5d", s[i].score[j]);
}
printf("%10d\n", s[i].total);
}
}
int main() {
int n;
scanf("%d", &n);
struct student stu[n];
input(stu, n);
calculateTotal(stu, n);
output(stu, n);
// 找出总分最高的学生
int maxTotal = stu[0].total;
int maxIndex = 0;
for (int i = 1; i < n; i++) {
if (stu[i].total > maxTotal) {
maxTotal = stu[i].total;
maxIndex = i;
}
}
return 0;
}
7-3 综合5-3:输出数组中最大值出现的次数
定义长度为N的数组,为每个元素存入0~20的之间的随机数,输出最大值出现的次数。
输入格式:
在第一行中给出N,在第二行中给出对应的元素
输出格式:
输出最大值出现的次数
输入样例:
在这里给出一组输入。例如:
20
12 19 0 2 4 6 6 10 20 10 9 1 17 6 11 14 7 10 7 4
输出样例:
在这里给出相应的输出。例如:
最大值出现的次数为:1
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int str[n];
for(int i=0;i<n;i++){
scanf("%d",&str[i]);
}
int max=-4658698;
for(int i=0;i<n;i++){
if(max<str[i]){
max=str[i];
}
}
int count=0;
for(int i=0;i<n;i++){
if(max==str[i]){
count++;
}
}
printf("最大值出现的次数为:%d",count);
}
7-4 幸运数字
越努力越幸运。这年诺诺读初三,3成为她的幸运数字,她光荣地加入了共青团。现在给你一串数字, 请找出其中的幸运数字(出现次数最多的那个数字,若有多个数字的出现次数都是最多,则为最大的那个数字)。
输入格式:
输入一串数字(长度不超过100)。
输出格式:
输出幸运数字。
输入样例:
320243315670920
输出样例:
3
#include<stdio.h>
#include<string.h>
int main(){
char m[101];
scanf("%s",m);
int str[10];
for(int i=0;i<10;i++){
str[i]=0;
}
int len=strlen(m);
for(int i=0;i<len;i++){
int k=m[i]-'0';
str[k]++;
}
int max=0;
for(int i=0;i<10;i++){
if(max<str[i]){
max=str[i];
}
}
for(int i=9;i>=0;i--){
if(max==str[i]){
printf("%d\n",i);
return 0;
}
}
}
7-5 字符串解压
输入压缩后的字符串,输出压缩前的字符串。
压缩的方法是把连续的相同字母压缩为"长度+字母"的形式,在本题中,单个的字母不需要压缩。
例如:3a5bx,解压后的结果为:aaabbbbbx;
例如:12ab10c2ax 解压后的结果为:aaaaaaaaaaaabbbbbbbbbbccax 。
输入格式:
压缩后的字符串。
输出格式:
解压后的字符串。
数据范围
100%的数据,字符串的长度<=100
输入样例:
3a5bx
输出样例:
aaabbbbbx
输入样例:
12ab10c2ax
输出样例:
aaaaaaaaaaaabccccccccccaax
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char s[300]={'\0'};
gets(s);
int n=strlen(s);
for(int i=0;i<n;i++)
{
if(isdigit(s[i]))
{
int t=0;
for(;i<n;i++)
{
t=t*10+s[i]-'0';
if(isdigit(s[i+1]))continue;
else break;
}
for(int j=0;j<t-1;j++)
{
printf("%c",s[i+1]);
}
continue;
}
printf("%c",s[i]);
}
printf("\n");
return 0;
}
7-6 拯救外星人
你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“5+7”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。
本题就请你写程序模仿外星人的行为。
输入格式:
输入在一行中给出两个正整数 A 和 B。
输出格式:
在一行中输出 (A+B) 的阶乘。题目保证 (A+B) 的值小于 12。
输入样例:
3 6
输出样例:
362880
#include<stdio.h>
int factorial(int n){
if(n==1||n==0)
return 1;
else return n*factorial(n-1);
}
int main(){
int a,b;
scanf("%d%d",&a,&b);
int sum=a+b;
int result=factorial(sum);
printf("%d",result);
}
7-7 聚餐人数-zzuli
有这样一道趣味数学题:男人、女人和小孩总计n个人,在一家饭店里吃饭,共花了cost先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请用穷举法编程计算男人、女人和小孩各有几个。
输入格式:
输入两个正整数,表示人数n和花费cost。
输出格式:
若问题有解,则输出所有解,每行输出三个数据,代表男人、女人和小孩的人数,用空格分隔;若问题无解,则输出“No answer"。
输入样例:
30 50
输出样例:
0 20 10
1 18 11
2 16 12
3 14 13
4 12 14
5 10 15
6 8 16
7 6 17
8 4 18
9 2 19
10 0 20
#include<stdio.h>
int main(){
int n,cost;
scanf("%d%d",&n,&cost);
int found=0;
for(int men=0;men<=cost/3;men++){
for(int women=0;women<=cost/2;women++){
int kids=cost-3*men-2*women;
if((women+men+kids==n)&&(3*men+2*women+kids==cost)){
printf("%d %d %d\n",men,women,kids);
found=1;
}
}
}
if(found!=1)printf("No answer");
}
7-8 素因数分解
对于给定的正整数n,输出n的素因数的乘式。
输入格式:
输入一个正整数n,要求1<n≤216−1。
输出格式:
输出n的素因数的乘式,要求这些素因数呈非递减排列。
输入样例1:
102
输出样例1:
2*3*17
输入样例2:
980
输出样例2:
2*2*5*7*7
#include<stdio.h>
void primefac(int n){
for(int i=2;i*i<=n;i++)
while(n%i==0){
printf("%d",i);
n/=i;
if(n>1){
printf("*");
}
}
if(n>1){
printf("%d\n",n);
}
}
int main(){
int n;
scanf("%d",&n);
primefac(n);
return 0;
}
7-9 计算a+aa+aaa+...+aa...a(n个a)的值
计算a+aa+aaa+...+aa...a(n个a)的值,a和n的值由键盘输入。a和n均为正整数,累加的结果定义为双精度实型。
输入格式:
a和n的值在一行输入,中间以空格分隔。
输出格式:
输出时结果只保留整数部分,并按输出样例的形式输出。
输入样例:
在这里给出一组输入。例如:
2 5
输出样例:
在这里给出相应的输出。例如:
sum=24690
#include<stdio.h>
#include<math.h>
int main(){
int a,n;
scanf("%d %d",&a,&n);
int i=n;
int j=0;
int sum=0;
while(i!=0){
sum+=a*pow(10,j)*i;
i--;
j++;
}
printf("sum=%d\n",sum);
}
7-10 输入一个整数,输出其所有因数。
输入一个整数,输出其所有因数。例如:输入10,输出1、2、5 和 10。
输入格式:
请在这里写输入格式。例如:输入一个正整数。
输出格式:
请在这里描述输出格式。例如:由小到大输出各因数,使用空格为分隔。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
1 2 5 10
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
if(n%i==0){
printf("%d ",i);
}
}
return 0;
}
7-11 求分数序列前N项和
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + 1/7 + ... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位,请注意等号的左右各有一个空格。题目保证计算结果不超过双精度范围。
输入样例1:
5
输出样例1:
sum = 1.787302
输入样例2:
1
输出样例2:
sum = 1.000000
输入样例3:
10
输出样例3:
sum = 2.133256
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
double sum=0.0;
for(int i=1;i<=n;i++){
sum+=1.0/(2*i-1);
}
printf("sum = %.6lf\n",sum);
return 0;
}
7-12 十进制转任意进制(自然数)
请编写程序,将十进制数转换成 n 进制数。
输入格式
x n
说明:x(0≤x≤2−63−1) 为十进制数,n(2≤n≤36) 为数制。
输出格式
y
说明:y 为 n 进制整数 (超过 9 的数字,用大写字母表示:A 表示 10, B 表示 11, ..., Z 表示 35)。
输入样例1
37 2
输出样例1
100101
输入样例2
4786 20
输出样例2
BJ6
#include <stdio.h>
#include <string.h>
void convertToBaseN(long long x, int n, char result[]) {
char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int index = 0;
if (x == 0) {
result[index++] = '0';
result[index] = '\0';
return;
}
while (x > 0) {
int digit = x % n;
result[index++] = digits[digit];
x /= n;
}
result[index] = '\0';
for (int i = 0; i < index / 2; i++) {
char temp = result[i];
result[i] = result[index - i - 1];
result[index - i - 1] = temp;
}
}
int main() {
long long x;
int n;
scanf("%lld %d", &x, &n);
char result[65];
convertToBaseN(x, n, result);
printf("%s\n", result);
return 0;
}