C程序练习

1.编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔。要求不输出时间差的负号。

#include<stdio.h>
int main()
{
    int hour1,minute1,hour2,minute2,hour3,minute3,time,time1,time2;
    printf("Input time one(hour, minute):");
    scanf("%d,%d",&hour1,&minute1);
    printf("Input time two(hour, minute):");
    scanf("%d,%d",&hour2,&minute2);

    time1=hour1*60+minute1;
    time2=hour2*60+minute2;
    if(time1>time2)
        time=time1-time2;
    else
        time=time2-time1;
    hour3=time/60;
    minute3=time%60;

    printf("%d hour %d minute
",hour3,minute3);
    return 0;
}
View Code

 2.

设capital是最初的存款总额(即本金),rate是整存整取的存款年利率,n 是储蓄的年份,deposit是第n年年底账号里的存款总额。已知如下两种本利之和的计算方式:

  • 按复利方式计息的本利之和计算公式为:deposit  =  capital * (1 + rate) n

  • 按普通计息方式计算本利之和的公式为:deposit  =  capital  * (1 + rate * n)

已知银行整存整取不同期限存款的年息利率分别为:

存期1年,利率为 0.0225

存期2年,利率为 0.0243

存期3年,利率为 0.0270

存期5年,利率为 0.0288

存期8年,利率为 0.0300

若输入其他年份,则输出"Error year!"

#include<stdio.h>
#include<math.h>
int main()
{
    int flag=1;
    int year;
    double capital,rate,deposit;
    char interest;
    printf("Input capital, year:");
    scanf("%lf,%d,&capital",&capital,&year);
    switch(year)
    {
    case 1:rate=0.0225;
            break;
    case 2:rate=0.0243;
            break;
    case 3:rate=0.0270;
            break;
    case 5:rate=0.0288;
            break;
    case 8:rate=0.0300;
            break;
    default:flag=0;

    }
    printf("Compound interest (Y/N)?");
    scanf(" %c",&interest);
    if((interest=='y'||interest=='Y')&&flag)
    {
        deposit=capital*pow(1+rate,year);
        printf("rate = %.4f, deposit = %.4f
",rate,deposit);
    }
    else if((interest=='n'||interest=='N')&&flag)
    {
        deposit=capital*(1+rate*year);
        printf("rate = %.4f, deposit = %.4f
",rate,deposit);
    }
    else
    {
        printf("Error year!
");
    }

    return 0;
}
View Code

 3.

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这=10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
int tenBit(int n,int *a);
 
int main()
{
    for(int x=10;x<=22;++x)
    {
        int a[10]={0,1,2,3,4,5,6,7,8,9};
        int d = tenBit(x*x*x,a)+tenBit(x*x*x*x,a);
        if(d==10){
            printf("age=%d
",x);
            break;
        }
    }
    return 0;
}
 
int tenBit(int n,int *a){
    int cnt =0;
    while(n){
        for(int i=0;i<10;++i){
            if(n%10==a[i]){
                a[i]=-1;
                cnt++;
            }
        }
        n/=10;
    }
    return cnt;
}
View Code

 4.

化简分数的最简分数(寻找分子分母的最大公约数)

#include<stdio.h>
int Gcd(int a,int b);
int main()
{   int a;
    int b;
    printf("Input m,n:");
    scanf("%d,%d",&a,&b);

    if (a<1||a>10000||b<1||b>10000)
    {
        printf("Input error!
");
    }
    else
        printf("%d/%d
",a/Gcd(a,b),b/Gcd(a,b));
    getchar();
    getchar();
    return 0;
}

int Gcd(int a,int b)
{
    int max=1;
    int i;
    int n = a < b ? a : b;
    for (i = 1; i <= n; ++i)
    {
        if (a % i == 0 && b % i == 0 )
        {
            if(max < i)
            {
                max = i;
            }
        }
    }

    return max;
}
最简分式化简

 5.

从键盘任意输入一个整数n,编程计算并输出1~n之间的所有素数之和。

函数原型:int IsPrime(int x);

函数功能:判断x是否是素数,若函数返回0,则表示不是素数,若返回1,则代表是素数

#include<stdio.h>
int IsPrime(int x);
int main()
{
    int x,i;
    int sum=0;
    printf("Input n:");
    scanf("%d",&x);
    if(x<2)
    {
        printf("sum=%d
",sum);
    }
    else
    {
        for(i=2;i<=x;i++)
        {
            if(!IsPrime(i))
            {
                sum+=i;
            }
        }
        printf("sum=%d
",sum);
    }

    getchar();
    getchar();
    return 0;
}

int IsPrime(int x)
{
    int i;
    for (i=2;i<x;i++)
    {
        if(x%i==0)
        {
             return 1;
             break;
        }

    }
    return 0;

}
素数和

 6.

已知一个集合A,对A中任意两个不同的元素求和,若求得的和仍在A内,则称其为好数对。例如,集合A={1 2 3 4},1+2=3,1+3=4,则1,2和1,3 是两个好数对。编写程序求给定集合中好数对的个数。

#include<stdio.h>

#define SIZE 1000
int Good(int a[], int m,int n);

int main()
{
    int i;
    int a[SIZE];
    int n;
    int m=0;
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("%d",Good(a,m,n));
    return 0;

}

int Good(int a[], int m,int n)
{
    int i,j,k;

    for(i=0;i<n-1;++i)
    {
        for (j=i+1;j<n;j++)
        {
            for(k=0;k<n;k++)
            {
                if(a[i]+a[j]==a[k])
                    m++;
            }
        }
    }
    return m;
}
好对数

 7.

猴子吃桃问题,反向递归

法一:

#include<stdio.h>
int Monkey(int n, int x);
int main()
{
    int n,x=1;
    printf("Input days n:");
    scanf("%d",&n);
    printf("x=%d
",Monkey(n,x));


}

int Monkey(int n, int x)
{
    if(n==1)
    {
        return x;
    }
    else
    {
        return Monkey((n-1),2*(x+1));
    }
}
View Code

法二:

#include <stdio.h>
int getPeachNumber(n)
{
    int num;    //定义所剩桃子数
    if(n==10)
    {
    return 1;    //递归结束条件
    } 
    else
    {
    num =(getPeachNumber(n+1)+1)*2;//这里是不应该用递归呢?
    printf("第%d天所剩桃子%d个
", n, num); //天数,所剩桃子个数
    }
    return num;
}
int main()
{
    int num = getPeachNumber(1);
    printf("猴子第一天摘了:%d个桃子。
", num);
    return 0;
}
View Code

 8.

据说,鲁智深一天中午匆匆来到开封府大相国寺,想蹭顿饭吃,当时大相国寺有99个和尚,只做了99个馒头。智清长老不愿得罪鲁智深,便把他安排在一个特定位置,之后对所有人说: 从我开始报数(围成一圈),第5个人可以吃到馒头(并退下) ,按此方法,所有和尚都吃到了馒头,唯独鲁智深没有吃上。请问他在那个位置? 能否借鉴筛法求出剩下的最后一个人的位置?

#include <stdio.h>
int main()
{
    int a[100]={0};
    int bread;
    int cnt=0;int i=0;
    for (bread=99; bread>0; ++i,i%=100)
    {
        if(a[i]==0)
        {
            cnt++;
        }
        if (cnt==5)
        {
            bread--;
            cnt=0;
            a[i]=-1;//改变已经分到的状态

        }
    }

    for(i=0;i<100;i++)
    {
        if (a[i]==0)
            printf("The result is %d: ",i+1);
    }

 return 0;
}
鲁智深吃馒头

 9.

Squeeze函数的功能是删除字符串s中所出现的与变量c相同的字符。例如,输入为:abcdef↙c↙输出为:abdef

#include <stdio.h>
#include <string.h>
void Squeeze(char *s, char c);
int main()
{
    char  a[80], c, *s;
    s = a;
    gets(a);
    scanf("%c",&c);
    Squeeze(s, c);
    printf("%s
", s);
    return 0;
    }
     
 void  Squeeze(char *s, char c)
    {
        int i, j;
        for (i = j = 0; s[i] != ''; i++)
            {
                if (__________)
                {
                    __________;
                    j++;
                }
            }
        _____________; /* 在字符串t2的末尾添加字符串结束标志 */
     }
code

 10.

从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出。   

函数原型为 int Myatoi(char str[]);其中,形参数组str[]对应用户输入的字符串,函数返回值为转换后的整型数。

(str[i]-'0');   //将字符数字转化为相应的数字

#include<stdio.h>
#include<string.h>
#define LENGTH  8
int Myatoi(char str[]);

int main()
{
    char str[LENGTH+1];
    printf("Input a string:");
    scanf("%7s",str);
    printf("%d
",Myatoi(str));

    return 0;
}

int Myatoi(char str[])
{
    int i;
    int result=0;
    for(i=0;str[i]!='';i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            result=result*10+(str[i]-'0');   //将字符数字转化为相应的数字
        }
    }
    return result;
}
View Code

 11.编程计算n(n<=500)以内的10个最大素数及其和,分别输出这最大的10个素数及其和。n的值要求从键盘输入。要求10个素数按从大到小的顺序输出。

#include<stdio.h>
#include<math.h>
int Isprime(int n);
int main()
{
    int i,n,cnt=0;
    int a[10]={0};
    int sum=0;
    printf("Input n(n<=500):");
    scanf("%d",&n);

    for (i=n;i>=2;--i)
    {

        if(Isprime(i))
        {
         a[cnt]=Isprime(i);
        sum+=a[cnt];
        printf("%6d",a[cnt]);
         if(cnt==9)
            break;
            cnt++;//严格注意位置
        }
    }
       printf("
sum=%d
",sum);
    getchar();
    getchar();



    return 0;
}

int Isprime(int n)
{
    int i,flag=1;
    for (i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
        flag=0;
         break;
        }
    }
    if(flag==1)
    {
        return n;
    }
    else
        return 0;

}
View Code

 12.

星期判断

题目内容:请输入星期几的第一个字母(不区分大小写)来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母(小写),否则输出“data error”。

#include<stdio.h>   
int main()  
{  
    char i,j;  
    printf("please input the first letter of someday:
");  
    scanf("%c",&i);  
    switch(i)  
    {
        case 'M':
        case 'm':  
            printf("monday
");  
            break;  
        case 'w':  
        case 'W':
            printf("wednesday
");  
            break;  
        case 'f': 
        case 'F':
            printf("friday
");  
            break;  
        case 't':  
        case 'T':
            printf("please input second letter:
");  
            scanf(" %c",&j);  
            if (j=='u')//||j=='U')   
            {  
                printf("tuesday
");  
                break;  
            }  
            else if (j=='h')//||j=='H')   
            {  
                printf("thursday
");  
                break;  
            }  
            else printf("data error
"); break;  
        case 's': 
        case 'S':
            printf("please input second letter:
");  
            scanf(" %c",&j);  
            if (j=='a')//||j=='A')   
            {  
                printf("saturday
");break;  
            }  
            if (j=='u')//||j=='U')   
            {  
                printf("sunday
");   
                break;  
            }  
            else printf("data error
"); break; 
        default :  
            printf("data error
"); break;  
    }  
    return 0;  
}
View Code

13.奖学金发放

题目内容:

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,每项奖学金获取的条件分别如下:

1) 院士奖学金:期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生每人均可获得8000元;

2) 五四奖学金:期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生每人均可获得4000元;

3) 成绩优秀奖:期末平均成绩高于90分(>90)的学生每人均可获得2000元;

4) 西部奖学金:期末平均成绩高于85分(>85)的西部省份学生每人均可获得1000元;

5) 班级贡献奖:班级评议成绩高于80分(>80)的学生干部每人均可获得850元;

只要符合上述条件就可获得相应的奖项,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。

#include<stdio.h>
typedef struct winners
{
    char name[20];
    int finalScore;
    int classScore;
    char work;
    char west;
    int paper;
    int scholarship;
}WIN;

 void Addup(WIN stu[],int n);
  int FindMax(WIN student[],int n);

 int main()
 {
     int n;
     WIN stu[10];
     printf("Input n:");
     scanf("%d",&n);
     Addup(stu,n);
     FindMax(stu,n);
     printf("%s get the highest scholarship %d
",stu[FindMax(stu,n)].name,stu[FindMax(stu,n)].scholarship);
     getchar();
     getchar();
     return 0;
 }

 void Addup(WIN stu[],int n)
 {
     int i;
     for (i=0;i<n;++i)
     {
         stu[i].scholarship=0;
         printf("Input name:");
         scanf("%s",stu[i].name);
         printf("Input final score:");
         scanf("%d",&stu[i].finalScore);
         printf("Input class score:");
         scanf("%d",&stu[i].classScore);
         printf("Class cadre or not?(Y/N):");
         scanf(" %c",&stu[i].work);
         printf("Students from the West or not?(Y/N):");
         scanf(" %c",&stu[i].west);
         printf("Input the number of published papers:");
         scanf("%d",&stu[i].paper);
         if(stu[i].finalScore>80&&stu[i].paper>0)
         {
             stu[i].scholarship+=8000;
         }
         if(stu[i].finalScore>85&&stu[i].classScore>80)
         {
             stu[i].scholarship+=4000;
         }
         if(stu[i].finalScore>90)
         {
             stu[i].scholarship+=2000;
         }
         if(stu[i].finalScore>85&&stu[i].west=='Y')
         {
             stu[i].scholarship+=1000;
         }
         if(stu[i].classScore>80&&stu[i].work=='Y')
         {
             stu[i].scholarship+=850;
         }
         printf( "name:%s,scholarship:%d
",stu[i].name,stu[i].scholarship);

     }


 }

 int FindMax(WIN student[],int n)
 {
     int i,k=0;
     int max=student[k].scholarship;
     for (i=1;i<n;i++)
     {
         if(student[i].scholarship>max)
         {
             max=student[i].scholarship;
             k=i;
         }
     }
     return k;

 }
View Code

14.评选最牛群主

现在要评选最牛群主,已知有3名最牛群主的候选人(分别是tom,jack和rose),有不超过1000人参与投票,最后要通过投票评选出一名最牛群主,从键盘输入每位参与投票的人的投票结果,即其投票的候选人的名字,请你编程统计并输出每位候选人的得票数,以及得票数最多的候选人的名字。候选人的名字中间不允许出现空格,并且必须小写。若候选人名字输入错误,则按废票处理。

#include<stdio.h>
#include<string.h>
typedef  struct
{
    char name[10];
    int m;
}Vote;


int main()
{
    Vote a[3];
    int j;
    for (j=0;j<3;j++)
    {
        a[j].m=0;
    }
    char *pName[]={"tom","jack","rose"};
    int i,n;
    char str[10];
    printf("Input the number of electorates:");
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        printf("Input vote %d:",i+1);
        scanf("%s",str);
        if(strcmp(str,pName[0])==0)
        {
            (a[0].m)++;
        }
        if(strcmp(str,pName[1])==0)
        {
            a[1].m++;
        }
        if(strcmp(str,pName[2])==0)
        {
            a[2].m++;
        }


    }
    printf("Election results:
");
    for (i=0;i<3;i++)
    {
    printf("%s:%d
",pName[i],a[i].m);
    }

    int k=0;
    int max=a[k].m;
    for (i=1;i<3;i++)
    {
        if(max<a[i].m)
        {
            max=a[i].m;
            k=i;
        }
    }
    printf("%s wins
",pName[k]);

    getchar();
    getchar();
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/sunshine88/p/8719372.html