C++ 程序设计 (西北工业大学)

  已过OJ,仅作参考(代码不一定是最优的,可能存在错误)

  NOJ练习一

  1、计算A+B

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a,b;
 7     cin >> a >> b;
 8     cout << a + b;
 9     
10     return 0;
11 }
View Code

  2、面积及体积的计算

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const double PI = 3.1415926;
 5 int main()
 6 {
 7     double r, h;
 8     cin >> r >> h;
 9     printf("%.2f\n", 2*PI*r);
10     printf("%.2f\n", PI*r*r);
11     printf("%.2f\n", 4*PI*r*r);
12     printf("%.2f\n", 4.0/3*PI*r*r*r);
13     printf("%.2f\n", PI*r*r*h);
14     return 0;
15 }
View Code

  3、总成绩和平均成绩

#include <iostream>
using namespace std;

int main()
{
    double m,l,e;
    cin >> m >> l >> e;
    printf("%.6f\n", m+l+e);
    printf("%.6f\n", (m+l+e)/3);
    return 0;
}
View Code

  NOJ练习二

  1、找最大数

#include <cstdio>

int main()
{
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    
    int max=a;
    if(b>max)
        max=b;
    if(c>max)
        max=c;
    
    printf( "%d\n", max );
        
    return 0;
}
View Code

  2、发奖金

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     double i,b;
 6     scanf("%lf",&i);
 7     
 8     if(i<=10){
 9         b=i*0.1;
10     }
11     else if(i<20){
12         b=1+(i-10)*0.075;
13     }
14     else if(i<40){
15         b=1.75+(i-20)*0.05;
16     }
17     else if(i<60){
18         b=2.75+(i-40)*0.03;
19     }
20     else if(i<100){
21         b=3.35+(i-60)*0.015;
22     }
23     else{
24         b=3.95+(i-100)*0.01;
25     }
26     
27     printf( "%f\n", b );
28         
29     return 0;
30 }
View Code

  3、第几天

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int y,m,d,t=0;
 6     scanf("%d-%d-%d",&y,&m,&d);
 7     
 8     int day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
 9     if(y%4==0&&y%10!=0||y%400==0)
10         day[2]++;
11     
12     for(int i=1; i<m; ++i)
13         t += day[i];
14     t+=d;
15     
16     printf("%d\n",t);
17         
18     return 0;
19 }
View Code

  4、成绩转换

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int score,ch;
 6     scanf("%d",&score);
 7     
 8     switch(score/10){
 9         case 10:
10         case 9:
11             ch='A';break;
12         case 8:
13             ch='B';break;
14         case 7:
15             ch='C';break;
16         case 6:
17             ch='D';break;
18         default:
19             ch='E';        
20     }
21     
22     printf("%c\n",ch);
23         
24     return 0;
25 }
View Code

  5、出租车费

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     double d,m;
 6     scanf("%lf",&d);
 7     if(d<=2){
 8         m=7;
 9     }        
10     else if(d<=15){
11         if(d-2==(int)(d-2))
12             m=7+(d-2)*1.5;
13         else
14             m=7+((int)(d-2)+1)*1.5;
15     }
16     else if(d-15==(int)(d-15)){
17         m=26.5+(d-15)*2.1;
18     }
19     else
20         m=26.5+((int)(d-15)+1)*2.1;
21     
22     printf("%f\n",m);
23     
24     return 0;
25 }
View Code

  NOJ练习三

  1、完数

 1 #include <stdio.h>
 2 
 3 #define N 100
 4 int main()
 5 {
 6     int n;
 7     scanf("%d",&n);
 8 
 9     for(int k=1; k<=n;++k )
10     {
11         int a[100] = {0},cnt = 0;
12         int sum = 0;
13         for(int i=1;i<k;++i){
14             if(k%i==0){
15                 sum += i;
16                 a[cnt++] = i; //因子
17             }
18         }
19         if(sum==k){ 
20             printf("%d=",sum);
21             for(int j=0;j<cnt;++j){
22                   if(j!=0){
23                      printf("+");
24                   }
25                   printf("%d",a[j]);
26             }
27             printf("\n");
28         }
29     }
30     
31     return 0;
32 }
View Code

  2、羽毛球比赛

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     for(char a='X'; a<='Z'; ++a)
 6     {
 7         for(char b='X'; b<='Z'; b++){
 8             for(char c='X'; c<='Z'; c++){
 9                 if(a==b||a==c||b==c||  //重复
10                    a=='X'||c=='X'||c=='Z')//条件
11                 continue;
12                 printf("A=%c\nB=%c\nC=%c\n", a, b, c);
13             }
14         }
15     }   
16     return 0;
17 }
View Code

  3、求素数

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a,b,t;
 6     scanf("%d%d", &a,&b);
 7     if(a>b)
 8         t=a,a=b,b=t;
 9     
10     for(;a<b;a++){             // a<b
11         for(t=2;t<a;t++){
12             if(a%t==0)
13                 break;
14         }
15         if(a==t)
16             printf("%d ",a);
17     }
18         
19     return 0;
20 } 
View Code

  4、数列之和

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n,a1=1,a2=1,t;
 6     double sum=0.0;
 7     
 8     scanf("%d",&n);
 9     
10     for(int i=0; i<n; ++i){
11         sum += 1.0*(a1+a2)/a2;
12         t=a1+a2;
13         a1=a2;
14         a2=t;
15     }
16     printf("%f\n",sum);
17     
18     return 0;
19 }
View Code

  5、自然数立方和

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int n,t,sum=0,i,j;
 6     scanf("%d",&n);
 7 
 8     for(i=1; sum!=n*n*n;  i+=2)//结论不成立 i递增
 9     {
10         t=0,sum=0;
11         for( j=i; t<n; j+=2, t++)//第一个奇数 i 最后一个奇数 j
12         {
13             sum+=j;                 //累加n次奇数
14         }
15     }
16 
17     printf("%d*%d*%d=%d=",n,n,n,n*n*n);
18     for( i-=2;  i<j-2;  i+=2 ) //i,j都多累加2
19         printf( "%d+",i );
20     printf( "%d\n",i );
21 
22     return 0;
23 }
View Code

  6、整数次方

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int x,a;
 6     scanf("%d%d",&x,&a);
 7     
 8     int s=x;  //1次方
 9     for(int i=2; i<=a; ++i){
10         s*=x; //x保持x值
11         s%=1000;        
12     }
13     printf("%d\n",s);
14         
15     return 0;
16 }
View Code

  7、韩信点兵

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int a,b,c,i,flag=0;
 6     scanf("%d%d%d",&a,&b,&c);
 7     
 8     for( i=10; i<=100; ++i ){
 9         if(i%3==a && i%5==b && i%7==c)
10         {
11             flag=1;
12             break;
13         }
14     }
15     if(flag)
16         printf("%d\n",i);
17     else
18         printf("-1\n");
19         
20     return 0;
21 }
View Code

  NOJ练习四

  1、逆序数

 1 #include <cstdio>
 2 
 3 void print( long int n);
 4 
 5 int main()
 6 {
 7     long int n;
 8     scanf( "%ld", &n );
 9     
10     print( n );
11     
12     return 0;
13 }
14 
15 void print( long int n)
16 {
17     if(n==0)
18         return;
19     printf("%d",n%10);
20     print( n/10 );    
21 }
View Code

  2、组合数

 1 #include <cstdio>
 2 
 3 int output( int n, int m);
 4 
 5 int main()
 6 {
 7     int n, m;
 8     scanf( "%d%d", &n, &m );
 9     
10     if( n < m )
11         printf("wrong\n");
12     else
13         printf( "%d\n", output( n, m ) );
14     
15     return 0;
16 }
17 
18 int output( int n, int m)
19 {
20     int a=1,b=1;
21     for(int i=1; i<=m; ++i){
22         a *= n--;
23         b *= i;
24     }
25     return a/b;
26 }
View Code

  3、梯形法求积分

  4、ack函数

 1 #include <cstdio>
 2 int ack( int m, int n ) ; //!
 3 int main()
 4 {
 5     int m,n;
 6     scanf( "%d%d",&m,&n );
 7     printf("%d\n", ack( m, n ) );
 8     
 9     return 0;
10 }
11 int ack( int m, int n ) {
12     if(m==0)
13         return n+1;
14     if(n==0)
15         return ack(m-1,1);
16     return ack(m-1,ack(m,n-1));
17 }
View Code

  5、数字加密

 1 #include <cstdio>
 2 
 3 int encryption(int n);
 4 
 5 int main()
 6 {
 7     int n=1998;
 8     scanf( "%d",&n );
 9     printf("%d\n", encryption( n ) );
10 
11     return 0;
12 }
13 
14 int encryption(int n){
15     int one,two,three,four;
16     one   =       (n/1000+5)%10;             //4->1
17     two   = 10 *  ( (n/100%10+5)%10 );      //3->2
18     three = 100 * ( (n/10%10+5)%10 );       //2->3
19     four  = 1000 *( (n%10+5)%10 );          //1->4
20     return one+two+three+four;
21 }
View Code

  6、最小整数

 1 #include <cstdio>
 2 
 3 int fceil(double x);
 4 
 5 int main()
 6 {
 7     double x;
 8     scanf( "%lf",&x );
 9     printf("%d\n", fceil( x ) );
10 
11     return 0;
12 }
13 
14 int fceil(double x){
15     if(x<0)
16         return (int)x;
17     return x+0.5;
18 }
View Code

  7、发工资

 1 #include <cstdio>
 2 
 3 int salary( int s );
 4 
 5 int main()
 6 {
 7     int count=0,n,s;    
 8     scanf( "%d", &n );
 9     
10     while(n--){
11         scanf("%d",&s);
12         count+=salary(s);
13     }
14     
15     printf("%d\n", count );
16 
17     return 0;
18 }
19 
20 int salary( int s )
21 {
22     /* int CNY[] = {100,50,10,5,2,1};
23     int count = s/100;
24     for(int i=0; i<sizeof(CNY)/sizeof(int); ++i)
25     {
26         s%=CNY[i];
27         count += (s%CNY[i])/CNY[i+1];
28     }
29     return count; */
30     return
31         s/100+(s%=100)/50+(s%=50)/10+(s%=10)/5+(s%=5)/2+(s%=2)/1;
32 }
View Code

  8、时间求和

 1 #include <cstdio>
 2 
 3 struct Time{
 4     int hour;
 5     int minute;
 6     int second;
 7 };
 8 
 9 void sum(struct Time a, struct Time b);
10 
11 int main()
12 {
13     struct Time a,b;
14     scanf( "%d%d%d%d%d%d", 
15             &a.hour,&a.minute,&a.second,
16             &b.hour,&b.minute,&b.second);
17     sum( a, b );
18 
19     return 0;
20 }
21 
22 void sum(struct Time a, struct Time b){
23     struct Time c;
24     c.second = a.second + b.second;
25     c.minute = a.minute + b.minute;
26     c.hour = a.hour + b.hour;
27     if(c.second>=60)
28     {
29         c.second -= 60;
30         c.minute++;
31     }
32     if(c.minute>=60)
33     {
34         c.minute-=60;
35         c.hour++;
36     }
37     printf("%d %d %d\n", c.hour,c.minute,c.second);
38 }
View Code
 1 #include <cstdio>
 2 
 3 void sum(int AH,int AM,int AS,int BH,int BM,int BS);
 4 
 5 int main()
 6 {
 7     int AH, AM, AS, BH, BM, BS;
 8     scanf( "%d%d%d%d%d%d", 
 9             &AH, &AM, &AS,
10             &BH, &BM, &BS);
11     sum( AH, AM, AS, BH, BM, BS );
12 
13     return 0;
14 }
15 
16 void sum(int AH,int AM,int AS,int BH,int BM,int BS){
17     int CS = AS + BS;
18     int CM = AM + BM;
19     int CH = AH + BH;
20     if(CS>=60)
21     {
22         CS -= 60;
23         CM++;
24     }
25     if(CM>=60)
26     {
27         CM-=60;
28         CH++;
29     }
30     printf("%d %d %d\n", CH,CM,CS);
31 }
View Code

  NOJ练习五

  1、数组“赋值”

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int a[100],b[100];
 6     int n;
 7     scanf("%d", &n );
 8     for(int i=0; i<n; ++i)
 9     {
10         scanf("%d",&a[i]);
11         b[i] = a[i];
12     }
13     for(int j=0; j<n; ++j)
14         if(j%2)
15             printf("%d ",b[j]);
16     printf("\n");
17     
18     return 0;
19 }
View Code

  2、左上角

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int arr[100][100];
 6     int n;
 7     scanf("%d", &n );
 8     
 9     for(int i=0; i<n; ++i)
10     {
11         for(int j=0; j<n; ++j){
12             scanf("%d",&arr[i][j]);
13         }
14     }
15     
16     for(int i=0; i<n; ++i)
17     {
18         for(int j=0; j<n-i; ++j){
19             printf("%d ",arr[i][j]);
20         }
21         printf("\n");
22     }
23             
24     return 0;
25 }
View Code

  3、边沿与内芯的差

 1 #include <cstdio>
 2 
 3 int main()
 4 {
 5     int arr[100][100];
 6     int n,m,s1=0,s2=0;
 7     scanf("%d%d", &n,&m );
 8     
 9     for(int i=0; i<n; ++i)
10     {
11         for(int j=0; j<m; ++j){
12             scanf("%d",&arr[i][j]);
13             if(i==0||i==n-1||j==0||j==m-1)
14                 s1+=arr[i][j];
15             else
16                 s2+=arr[i][j];            
17         }
18     }
19         
20     printf("%d\n",s1-s2);
21             
22     return 0;
23 }
View Code

  4、平均值

 1 #include <cstdio>
 2 
 3 double avg(int A[],int s,int e);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,s,e;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d%d",&s,&e);
15     printf("%f\n",avg(a,s,e));
16             
17     return 0;
18 }
19 
20 double avg(int A[],int s,int e)
21 {
22     double sum=0.0;
23     for(int j=s; j<=e; ++j)//!
24         sum+=A[j];        
25     return sum/(e-s+1);    //!
26 }
View Code

  5、冒泡排序

 1 #include <cstdio>
 2 
 3 void BubbleSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,s,m;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d%d",&s,&m);
15     BubbleSort(a,s,m);
16     
17     for(int i=0; i<n; ++i)
18         printf("%d ",a[i]);
19             
20     return 0;
21 }
22 
23 void BubbleSort(int A[],int s,int m)
24 {
25     for( ; m>0; m--)  //连续m个元素,s是开始元素,m不是结束元素
26     {
27         for(int j=s; j<s+m-1; ++j) //s+m<=100 j最大98即<99,保证j+1最大99的边界
28             if(A[j]<A[j+1])
29             {
30                 int t=A[j];
31                 A[j]=A[j+1];
32                 A[j+1]=t;
33             }
34     }
35 }
View Code

  6、选择排序

 1 #include <cstdio>
 2 
 3 void SelectionSort(int a[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n;
 9     scanf( "%d", &n );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &a[i]);
13     
14     int s,m;
15     scanf("%d%d",&s,&m);
16     
17     SelectionSort( a, s, m );
18     
19     for(int j=0; j<n; ++j)
20         printf("%d ", a[j]);
21     
22     return 0;
23 }
24 void SelectionSort(int a[],int s,int m)
25 {
26     
27     for(int i=s; i<s+m-1; ++i)
28     {            
29         int index=i;    
30         for( int j=i+1; j<s+m; ++j){    
31             if(a[index]<a[j]){
32                 index = j;
33             }
34         }        
35         if(index!=i){        
36             int t=a[i];
37             a[i]=a[index];
38             a[index]=t;
39         }        
40     }            
41 }
View Code

  7、插入排序

 1 #include <cstdio>
 2 
 3 void InsertionSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n;
 9     scanf( "%d", &n );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &a[i]);
13     
14     int s,m;
15     scanf("%d%d",&s,&m);
16     
17     InsertionSort( a, s, m );
18     
19     for(int j=0; j<n; ++j)
20         printf("%d ", a[j]);
21     
22     return 0;
23 }
24 void InsertionSort(int A[],int s,int m)
25 {    
26     int i;
27     for(i=s+1; i<s+m; ++i) //!
28     {
29         int j=i-1,key=A[i];/*保存第i个元素,左边的元素i-1*/
30         while( j>=s && key>A[j] ) //!
31         {/*保存的元素key与之前的元素从右向左逐个比较*/
32             A[j+1]=A[j];/*移动(向右赋值)*/
33             j--;
34         }
35         A[j+1]=key;/*j--退出,恢复正确值j+1*/
36     }    
37 }
View Code

  8、恐怖水母

 1 #include <cstdio>
 2 
 3 void InsertionSort(int A[],int s,int m);
 4 
 5 int main()
 6 {
 7     int d[100],p[100]; //d是n个触手的直径,p是m个海绵宝宝的能力值
 8     int n,m; //n个触手,m个海绵宝宝
 9     scanf( "%d%d", &n,&m );
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d", &d[i]);    
13     for(int j=0; j<m; ++j)
14         scanf("%d", &p[j]);
15     
16     InsertionSort(d,0,n);
17     InsertionSort(p,0,m);
18     
19     int x=0; //x是金币
20     for(int i=0; i<n; ++i)
21     {
22         for(int j=0; j<m; ++j){
23             if( p[j] >= d[i] ){ //找到能力值大于等于触手直径
24                 x += p[j];
25                 break;
26             }                
27         }
28     }
29     
30     if(x==0) //无解
31         printf("NULL\n");
32     else    
33         printf("%d\n",x);
34     
35     return 0;
36 }
37 void InsertionSort(int A[],int s,int m)
38 {    
39     int i;
40     for(i=s+1; i<s+m; ++i) 
41     {
42         int j=i-1,key=A[i];
43         while( j>=s && key<A[j] ) //!
44         {
45             A[j+1]=A[j];
46             j--;
47         }
48         A[j+1]=key;
49     }    
50 }
View Code

  9、山迪的麻烦

#include <cstdio>

int BubbleSort(int A[],int n);

int main()
{
    int card[100];
    int n; 
    scanf( "%d", &n );
    
    for(int i=0; i<n; ++i)
        scanf("%d", &card[i]);    
    
    printf("%d\n", BubbleSort(card,n) );
    
    return 0;
}

int BubbleSort(int A[],int n)
{
    int count=0;
    for(int i=0; i<n; ++i) 
    {
        for(int j=0; j<n-1; ++j) 
            if(A[j]>A[j+1])
            {
                int t=A[j];
                A[j]=A[j+1];
                A[j+1]=t;
                count++;
            }
    }
    return count;
}
View Code

  10、二分查找

 1 #include <cstdio>
 2 
 3 int BinarySearch(int A[],int n, int m);
 4 
 5 int main()
 6 {
 7     int a[100];
 8     int n,m;
 9     scanf("%d", &n);
10     
11     for(int i=0; i<n; ++i)
12         scanf("%d",&a[i]);
13     
14     scanf("%d", &m);
15 
16     int i = BinarySearch(a,n,m);
17     if(-1==i)
18         printf("null\n");
19     else
20         printf("%d\n", i);
21             
22     return 0;
23 }
24 
25 int BinarySearch(int A[],int n, int m)
26 {
27     int left = 0;
28     int right = n-1;
29     while( left<=right )
30     {
31         int mid =  left + (right-left)/2;
32         if(A[mid]==m) 
33             return mid;
34         if( A[mid]>m ) 
35             right = mid-1;
36         else
37             left = mid+1;
38     }
39     return -1;
40 }
View Code

  NOJ练习六

  1、字符串左中右

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void Left(char src[],int n,char dest[]);
 5 void Right(char src[],int n,char dest[]);
 6 void Mid(char src[],int loc,int n,char dest[]);
 7 
 8 int main()
 9 {
10     char src[128] = "www.nwpu.edu.cn";
11     char dest[128] = "";
12     int n,loc;
13     scanf("%s%d%d", src, &n, &loc);
14     Left( src, n, dest);
15     Right( src, n, dest );
16     Mid( src, loc, n, dest );
17     return 0;
18 }
19 
20 void Left(char src[],int n,char dest[]){
21     int i=0;
22     for( ; i<n; ++i)
23         dest[i] = src[i];
24     dest[i] = '\0';
25     printf("%s\n", dest);
26 }
27 
28 void Right(char src[],int n,char dest[]){
29     int j=n, i=strlen(src)-1;
30     dest[j] = '\0';    
31     while(n--){
32         dest[--j] = src[i--];
33     }    
34     printf("%s\n", dest);
35 }
36 
37 void Mid(char src[],int loc,int n,char dest[]){
38     int j=0;
39     for(; j<n; ++j)
40         dest[j] = src[loc++];
41     dest[j] = '\0';
42     printf("%s\n", dest);
43 }
View Code

  2、字符串替换

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char src[1000] = "";    
 7     gets( src );
 8     char* p = src;
 9     char* pre = p;
10     
11     while(*p){
12         if( !strncmp(p,"you",3) )
13         {
14             *pre++ = 'w';
15             *pre++ = 'e';
16              p+=3;
17         }
18         *pre++ = *p++;
19     }
20     *pre='\0';
21     
22     puts(src);
23     
24     return 0;
25 }
View Code

  3、字符串比较

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int stringcompare(char S1[],char S2[]);
 5 
 6 int main()
 7 {
 8     char s1[128],s2[128];
 9     gets(s1);
10     gets(s2);
11     printf("%d\n",stringcompare(s1,s2));
12     
13     return 0;
14 }
15 
16 int stringcompare(char S1[],char S2[]){
17     int ret=0;
18     while(!(ret=*(unsigned char*)S1-*(unsigned char*)S2) && S2){
19         S1++, S2++; //两字符串对应字符不等了 或者 S2到字符串尾部了
20     }                //'\0'与其他字符不等 也相当于S1到尾部了
21     return ret;        
22 }
View Code

  4、字符串复制

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 char* stringcopy(char S1[],char S2[],int m);
 5 
 6 int main()
 7 {
 8     char s1[128]="",s2[128]="";
 9     int m;
10     gets(s2);
11     scanf("%d",&m);
12     printf("%s\n",stringcopy(s1,s2,m));
13     
14     return 0;
15 }
16 
17 char* stringcopy(char S1[],char S2[],int m){
18     char *p = (char*)S1;
19     char *q = (char*)S2+m;
20     while( *p++ = *q++ );
21     return (char*)S1; 
22 }
View Code

  5、字符串排序

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void stringsort(char s[][32]);
 5 
 6 int main()
 7 {
 8     char s[10][32];
 9     for( int i=0; i<10; ++i ){
10         scanf("%s",s[i]);
11     }
12     stringsort( s );
13     for(int i=0; i<10; ++i)
14         printf("%s ",s[i]);
15     
16     return 0;
17 }
18 //冒泡排序
19 void stringsort(char s[][32]){
20     char t[32];
21     for(int i=0; i<10-1; ++i){
22         for(int j=0; j<10-i-1; ++j){
23             if(strcmp(s[j],s[j+1])>0){
24                 strcpy(t,s[j]);
25                 strcpy(s[j],s[j+1]);
26                 strcpy(s[j+1],t);
27             }
28         }
29     }
30 }
View Code

  6、“摘”数字

 1 #include <cstdio>
 2 #include <cstdlib>
 3 
 4 int main()
 5 {
 6     int arr[32];
 7     char s[128];
 8     char* p = s;
 9     int i=0,flag=1;
10     
11     gets( s );
12     
13     while( *p )
14     {
15         if( *p>='0'&&*p<='9' )
16         {
17             if(flag)
18                 arr[i++]=atoi(p);
19             flag=0;
20         }
21         else{
22             flag=1;
23         }
24         p++;
25     }
26     printf("%d\n", i );
27     for(int j=0; j<i; ++j)
28         printf("%d ",arr[j]);
29     
30     return 0;
31 }
View Code

  7、字符串逆序

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char s[128];    
 7     gets( s );    
 8     
 9     int i,j=0;
10     while(s[j]!='=')
11         j++;
12     s[j]='\0';
13         
14     for(i=0,j--; i<j; i++,j--)
15     {
16         char t=s[i];
17         s[i]=s[j];
18         s[j]=t;
19     }
20     
21     printf( "%s\n", s );
22     
23     return 0;
24 }
View Code

  8、合并字符串

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void stringmerge(char S1[],char S2[]);
 5 
 6 int main()
 7 {
 8     char s1[128],s2[128];    
 9     gets( s1 );    
10     gets( s2 );    
11     
12     stringmerge( s1, s2);
13     //strcat(s1,s2);
14     
15     printf( "%s\n", s1 );
16     
17     return 0;
18 }
19 
20 void stringmerge(char S1[],char S2[]){
21     while( *(char*)S1 )
22         (char*)S1++;
23     while( *(char*)S1++ = *(char*)S2++ );    
24 }
View Code

  9、删除字符

 1 #include <cstdio>
 2 
 3 void deletechar(char S[],char c);
 4 
 5 int main()
 6 {
 7     char s[128],c;
 8     gets( s );
 9     c = getchar();
10 
11     deletechar( s, c);
12 
13     printf( "%s\n", s );
14 
15     return 0;
16 }
17 
18 void deletechar(char S[],char c){
19     char *p1=S, *p2=S;
20     while(*p2){
21         if(*p2!=c)  //!!!  
22             *p1++ = *p2;  
23         p2++;
24     }
25     *p1='\0';  //!!!
26 }
View Code

  10、文章统计

 1 #include <cstdio>
 2 
 3 int cletter,sletter,digit,space,other;
 4 void count(char *s);
 5 
 6 int main()
 7 {
 8     char s[128];
 9     
10     int n=3;
11     while( n-- ){
12         gets( s );    
13         count( s );    
14     }
15     
16     printf("%d %d %d %d %d\n",
17         cletter,sletter,digit,space,other);    
18         
19     return 0;
20 }
21 
22 void count(char *s)
23 {    
24     while( *s )
25     {        
26         if(*s>='A'&&*s<='Z')
27             cletter++;
28         else if(*s>='a'&&*s<='z')
29             sletter++;
30         else if(*s>='0'&&*s<='9')
31             digit++;
32         else if(*s==' ')
33             space++;
34         else
35             other++;
36         s++;
37     }    
38 }
View Code

  11、分离单词

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int main()
 5 {
 6     char s1[128]="",s2[128]="";        
 7     gets( s1 );
 8     
 9     int len = strlen(s1);
10     char* p1=s1+len-1; //字符串尾部指针
11     
12     int flag =0;//不是字母
13     int count=0;//字母个数
14 
15     for(int i=0; i<=len; ++i)
16     {
17         if( *p1>='a'&&*p1<='z' || 
18              *p1>='A'&&*p1<='Z' ) //如果是字母
19         {
20             count++;  //记录字母个数
21             flag = 1; //是字母
22         }    
23         else {
24             flag=0;   //不是字符        
25         }
26                 
27         if(!flag && count) //出现不是字母且字母个数不为0,进行单词连接
28         {                                        
29             strncat(s2,p1+1,count); //连接单词
30             if(i!=len) //最后一个单词没有空格
31                 strcat(s2," ");
32             
33             flag = 1;  //设定是字母
34             count = 0; //字母个数统计归0
35         }
36         p1--; //移动字符串指针        
37     }
38     
39     printf("%s\n",s2); //有回车
40         
41     return 0;
42 }
View Code

  12、特殊要求的字符串

 1 #include <cstdio>
 2 #include <cstring>
 3 int main()
 4 {
 5     char a[10000],b[5000],c[5000],t,k;
 6     int n,i,j;
 7     gets(a);
 8     n=strlen(a);
 9     if(n%2==0)
10     {
11         for(i=0;i<n/2;++i)
12             b[i]=a[i];
13         for(i=n/2;i<n;++i)
14             c[i-n/2]=a[i];
15         for(i=1;i<n/2;++i)
16             for(j=0;j<n/2-i;++j)
17                 if(b[j]<b[j+1])
18                     t=b[j],b[j]=b[j+1],b[j+1]=t;
19         for(i=1;i<n/2;i++)
20             for(j=0;j<n/2-i;j++)
21                 if(c[j]>c[j+1])
22                     t=c[j],c[j]=c[j+1],c[j+1]=t;
23         strcat(c,b);
24         puts(c);
25     }
26     else{
27         for(i=0;i<n/2;i++)
28             b[i]=a[i];
29         for(i=n/2+1;i<n;i++)
30             c[i-(n/2+1)]=a[i];
31         for(i=1;i<n/2;i++)
32             for(j=0;j<n/2-i;j++)
33                 if(b[j]<b[j+1])
34                     t=b[j],b[j]=b[j+1],b[j+1]=t;
35         for(i=1;i<n/2;i++)
36             for(j=0;j<n/2-i;j++)
37                 if(c[j]>c[j+1])
38                     t=c[j],c[j]=c[j+1],c[j+1]=t;
39         printf("%s",c);
40         putchar(a[n/2]);
41         printf("%s",b);
42     }
43     return 0;
44 }
View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int  lessthan(char a,char b);
 5 int  greaterthan(char a,char b);
 6 void bubble(char* s, int n, int(*compare)(char,char));
 7 
 8 int main()
 9 {
10     char a[10000],b[5000],c[5000];
11     int n,i;
12     gets(a);
13     n=strlen(a);
14     if(n%2==0)
15     {
16         for(i=0;i<n/2;++i)
17             b[i]=a[i];
18         for(i=n/2;i<n;++i)
19             c[i-n/2]=a[i];
20         bubble(b,n/2,lessthan);
21         bubble(c,n/2,greaterthan);
22         strcat(c,b);
23         puts(c);
24     }
25     else{
26         for(i=0;i<n/2;i++)
27             b[i]=a[i];
28         for(i=n/2+1;i<n;i++)
29             c[i-(n/2+1)]=a[i];
30         bubble(b,n/2,lessthan);
31         bubble(c,n/2,greaterthan);
32         printf("%s",c);
33         putchar(a[n/2]);
34         printf("%s",b);
35     }
36     return 0;
37 }
38 int  lessthan(char a,char b){
39     return  a < b;
40 }
41 int  greaterthan(char a,char b){
42     return  a > b;
43 }
44 void bubble(char* s, int n, int(*compare)(char,char))
45 {
46     int i,j;
47     char t;
48     for(i=1;i<n;i++){
49         for(j=0;j<n-i;j++){
50             if(compare(s[j],s[j+1]))
51                 t=s[j],s[j]=s[j+1],s[j+1]=t;
52         }            
53     }            
54 }
View Code
 1 //不知道为什么过不了OJ
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 void stringsort1(char *s,int start, int end);
 6 void stringsort2(char *s,int start, int end);
 7 
 8 int main()
 9 {
10     char s[10000]="";
11     char t[10000]="";
12     gets( s );
13     //分割
14     int n=strlen( s );
15     int left=n/2,right=n/2;
16     if(n%2){
17         right++;
18     }
19     //排序
20     stringsort1(s,0,left);
21     stringsort2(s,right,n);    
22     //交换 
23     strncpy(t,s,left);    
24     strncpy(s,s+right,left);
25     strncpy(s+right,t,left);
26     //输出
27     printf("%s\n", s );
28     
29     return 0;
30 }
31 //降序
32 void stringsort1(char *s,int start, int end)
33 {
34     int key[256]={0},index=start;//!!!
35     for(int i=start; i<end; ++i)
36     {    
37         key[s[i]]++;        
38     }
39     for(int j=256;j>=0; --j)
40     {
41         if(key[j]){
42             s[index++] = j;
43             key[j]--;
44             j++;
45         }
46     }
47 }
48 //升序
49 void stringsort2(char *s,int start, int end)
50 {
51     int key[256]={0},index=start;//!!!
52     for(int i=start; i<end; ++i)
53     {    
54         key[s[i]]++;        
55     }
56     for(int j=0;j<=256; ++j)
57     {
58         if(key[j]){
59             s[index++] = j;
60             key[j]--;
61             j--; //!!!
62         }
63     }
64 }
View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 int  lessthan(char a,char b);
 5 int  greaterthan(char a,char b);
 6 void bubble(char* s, int start,int end, int(*compare)(char,char));
 7 
 8 int main()
 9 {
10     char s[10000]="";
11     char t[10000]="";
12     gets( s );
13     //分割
14     int n=strlen( s );
15     int left=n/2,right=n/2;
16     if(n%2){
17         right++;
18     }
19     //排序
20     bubble(s,0,left,lessthan);
21     bubble(s,right,n,greaterthan);    
22     //交换 
23     strncpy(t,s,left);    
24     strncpy(s,s+right,left);
25     strncpy(s+right,t,left);
26     //输出
27     printf("%s\n", s );
28     
29     return 0;
30 }
31 int  lessthan(char a,char b){
32     return  a < b;
33 }
34 int  greaterthan(char a,char b){
35     return  a > b;
36 }
37 void bubble(char* s, int start, int end, int(*compare)(char,char))
38 {
39     int i,j;
40     char t;
41     for(i=start+1;i<end;i++){
42         for(j=start;j<start+end-i;j++){
43             if(compare(s[j],s[j+1]))
44                 t=s[j],s[j]=s[j+1],s[j+1]=t;
45         }            
46     }    
47 }
View Code

  NOJ练习七

  1、分数加减法

 1 #include <stdio.h>
 2 
 3 int gcd(int a,int b);
 4 
 5 int main()
 6 {
 7     int a,b,c,d;
 8     int up,down;
 9     char op;
10     
11     scanf("%d/%d%c%d/%d",&a,&b,&op,&c,&d);
12     
13     up = (op=='+') ? a*d+c*b : a*d-c*b;
14     down = b*d;
15     
16     if(!up){
17         printf("0\n");
18     }    
19     else{
20         int reduce = gcd(up,down);
21         printf("%d/%d\n",up/reduce,down/reduce);
22     }
23     
24     return 0;
25 }
26 
27 int gcd(int a,int b){
28     return b==0?a:gcd(b,a%b);
29 }
View Code

  2、二进制

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int n, cnt=32;
 6     char binary[33]="";
 7     
 8     scanf("%d",&n);
 9     
10     while(n){
11         binary[--cnt] = n&0x1 ? '1' : '0';
12         n>>=0x1;
13     }
14         
15     printf("%s\n",binary+cnt);
16     
17     return 0;
18 }
View Code

  3、字符串加密

 1 #include <stdio.h>
 2 
 3 void strencode(char *s);
 4 
 5 int main()
 6 {
 7     char str[128]="";
 8     scanf("%s",str);
 9     
10     strencode(str);    
11     printf("%s\n",str);    
12         
13     return 0;
14 }
15 
16 void strencode(char *s){
17     while(*s){
18         if( (*s>='A'&&*s<='Z') && (*s+=3)>'Z' ){
19             *s-=26;
20         }
21         else if( (*s>='a'&&*s<='z') && (*s-=3)<'a' ){
22             *s+=26;            
23         }
24         s++;
25     }
26 }
View Code

  4、计算成绩表

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct student{
 5     long no;
 6     char name[128];
 7     int age;
 8     //double english,maths,chinese,politics,physics,chemistry,computer;
 9     double achievement[7];
10     /* double total;//题目要求 无输出
11     double ave;  //题目要求 无输出 
12     bool operator < (const student& s){    
13         return total<s.total;
14     } */
15 };
16 int main()
17 {
18     student stu[10],max;
19     /* max.total=0.0; */
20     double total=0.0;
21     int i=0;
22     while(i<10)
23     {
24         int j=0;
25         double t=0.0;
26         scanf("%ld%s%d",&stu[i].no,stu[i].name,&stu[i].age);
27         while(j<7){
28             scanf("%lf",&stu[i].achievement[j]);
29             t+=stu[i].achievement[j];
30             j++;
31         }
32         /* stu[i].total = t;
33         stu[i].ave   = stu[i].total/7; 
34         if(max.total<stu[i].total) //if(max<stu[i]) 
35             max=stu[i];    */        
36         if(total<t){
37             total=t;
38             max = stu[i];
39         }        
40         i++;
41     }
42     printf("%ld %s %d %.2f %.2f %.2f %.2f %.2f %.2f %.2f ", //注意:最后有个空格
43         max.no,
44         max.name,
45         max.age,
46         max.achievement[0],
47         max.achievement[1],
48         max.achievement[2],
49         max.achievement[3],
50         max.achievement[4],
51         max.achievement[5],
52         max.achievement[6]
53     );
54     return 0;
55 }
View Code

  5、复数

 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef struct complex {
 5     double r;
 6     double i;
 7 }COMPLEX;
 8 
 9 //和 (a+bi)+(c+di)=(a+c)+(b+d)i
10 void sum(const COMPLEX& c1, const COMPLEX& c2){
11     //(-1.00+5.00i)+(4.00+3.00i)=(3.00+8.00i)
12     char op = '+';
13     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
14             c1.r,c1.i,op,c2.r,c2.i,
15        (c1.r+c2.r),
16        (c1.i+c2.i)
17     );
18 }
19 
20 //差 (a+bi)-(c+di)=(a-c)+(b-d)i
21 void difference(const COMPLEX& c1, const COMPLEX& c2){
22     //(-1.00+5.00i)-(4.00+3.00i)=(-5.00+2.00i)    
23     char op = '-';
24     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
25             c1.r,c1.i,op,c2.r,c2.i,
26         (c1.r-c2.r),
27         (c1.i-c2.i)
28     );
29 }
30 
31 //积 (a+bi)*(c+di)=(ac-bd)+(bc+ad)i
32 void product(const COMPLEX& c1, const COMPLEX& c2){
33     //(-1.00+5.00i)*(4.00+3.00i)=(-19.00+17.00i)
34     char op = '*';
35     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
36             c1.r,c1.i,op,c2.r,c2.i,
37        (c1.r*c2.r-c1.i*c2.i),
38        (c1.i*c2.r+c1.r*c2.i)
39     );    
40 }
41 
42 //商 (a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +((bc-ad)/(c^2+d^2))i
43 void quotient(const COMPLEX& c1, const COMPLEX& c2){
44     //(-1.00+5.00i)/(4.00+3.00i)=(0.44+0.92i)
45     char op = '/';
46     printf("(%.2f%+.2fi)%c(%.2f%+.2fi)=(%.2f%+.2fi)\n",
47             c1.r,c1.i,op,c2.r,c2.i,
48        (c1.r*c2.r+c1.i*c2.i)/(c2.r*c2.r+c2.i*c2.i),
49        (c1.i*c2.r-c1.r*c2.i)/(c2.r*c2.r+c2.i*c2.i)
50     );    
51 }
52 
53 int main()
54 {
55     COMPLEX c1,c2;
56     scanf("%lf%lf%lf%lf",&c1.r,&c1.i,&c2.r,&c2.i);
57     //和 sum  
58     sum(c1,c2);
59     //差 difference
60     difference(c1,c2);
61     //积 product 
62     product(c1,c2);
63     //商 quotient 
64     quotient(c1,c2);    
65     return 0;
66 }
View Code

  6、删除链表的节点

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct student{
 5     int no;
 6     char name[12];
 7     int age;
 8 };
 9 
10 typedef struct node *linkedList; 
11 struct node{            //链表结点
12     struct student stu; //学生信息
13     struct node *next;  //结点指针
14 };
15 
16 linkedList createLinkedListNode()//创建链表结点 
17 {
18     linkedList l;
19     l = (linkedList)malloc(sizeof (struct node) );
20     l->next = NULL;
21     return l;
22 }
23 
24 linkedList createLinkedList()//建立一个链表
25 {  
26     linkedList head,p;
27     head = p = createLinkedListNode();
28     
29     struct student stu;
30     while(true)
31     {
32         scanf("%d",&stu.no);
33         if(!stu.no){
34             break;
35         }
36         scanf("%s%d",stu.name,&stu.age);
37         p->next = createLinkedListNode();//尾插法
38         p->next->stu = stu;
39         p = p->next; //P指向新结点
40     }
41     
42     return head;    
43 }
44 
45 void deleteNode(linkedList& head, int no)
46 {
47     linkedList p1=head->next , p2=head ;
48     while(p1&&p1->stu.no!=no)
49     {
50         p2=p1;
51         p1=p1->next;
52     }
53     p2->next = p1->next; //删除结点
54     free(p1); 
55 }
56 
57 void printLinkedList(linkedList head)
58 {
59     linkedList p = head->next;
60     
61     while(p)
62     {
63         printf("%d ",p->stu.no);
64         p = p->next;
65     }
66     printf("\n");
67 }
68 
69 int main()
70 {
71     linkedList head = createLinkedList();
72     printLinkedList(head);
73     
74     int no;
75     scanf("%d",&no);
76     deleteNode(head,no);
77     
78     printLinkedList(head);
79     return 0;
80 }
View Code

  7、链表插入节点

 1 #include <iostream>
 2 using namespace std;
 3 
 4 typedef struct node *linkedList; 
 5 struct node{            //链表结点
 6     int no;                //职工号
 7     struct node *next;  //结点指针
 8 };
 9 
10 linkedList createLinkedListNode()//创建链表结点 
11 {
12     linkedList l;
13     l = (linkedList)malloc(sizeof (struct node) );
14     l->next = NULL;
15     return l;
16 }
17 
18 void insert( linkedList& head )
19 {
20     int no;
21     scanf("%d",&no);
22     linkedList p=head,s;
23     
24     while( p->next && no>p->next->no ){//升序
25         p=p->next;
26     }
27     
28     s = createLinkedListNode(); //创建一个结点
29     s->no = no;                 //数据
30     
31     s->next=p->next; //插入
32     p->next=s;
33 }
34 
35 linkedList create()//建立一个链表
36 {  
37     linkedList head;
38     head = createLinkedListNode();
39     
40     int n;
41     scanf("%d",&n);
42     
43     while(n--)
44     {                
45         insert( head );
46     }
47     
48     return head;    
49 }
50 
51 void list(linkedList head)
52 {
53     linkedList p = head->next;    
54     while(p)
55     {
56         printf("%d ",p->no);
57         p = p->next;
58     }
59     printf("\n");
60 }
61 
62 int main()
63 {
64     linkedList head = create();
65     insert(head);
66     list(head);
67 
68     return 0;
69 }
View Code

  8、链表动态增长或缩小

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int ageArr[100] = {0};
 5 
 6 typedef struct node *linkedList; 
 7 struct node{            //链表结点
 8     int age;                //职工号
 9     struct node *next;  //结点指针
10 };
11 
12 linkedList createLinkedListNode()//创建链表结点 
13 {
14     linkedList l;
15     l = (linkedList)malloc(sizeof (struct node) );
16     l->next = NULL;
17     return l;
18 }
19 
20 void deleteNode(linkedList& head, int age)
21 {
22     linkedList p1=head->next , p2=head ;
23     while(p1&&p1->age!=age)
24     {
25         p2=p1;
26         p1=p1->next;
27     }
28     p2->next = p1->next; //删除结点
29     free(p1); 
30 }
31 
32 void insert( linkedList& head )
33 {
34     int age;
35     scanf("%d",&age);
36     if(ageArr[age]){
37         deleteNode(head,age);//删除
38         ageArr[age]--;
39         return;
40     }
41     ageArr[age]++;
42     
43     linkedList p=head,s;
44     while( p->next ){//最后一个结点
45         p=p->next;
46     }
47     s = createLinkedListNode(); //创建一个结点
48     s->age = age;                 //数据
49     
50     s->next=p->next; //插入
51     p->next=s;
52 }
53 
54 linkedList create()//建立一个链表
55 {  
56     linkedList head;
57     head = createLinkedListNode();
58     
59     int n;
60     scanf("%d",&n);
61     
62     while(n--)
63     {                
64         insert( head );
65     }
66     
67     return head;    
68 }
69 
70 void list(linkedList head)
71 {
72     linkedList p = head->next;    
73     while(p)
74     {
75         printf("%d ",p->age);
76         p = p->next;
77     }
78     printf("\n");
79 }
80 
81 int main()
82 {
83     linkedList head = create();
84     list(head);
85 
86     return 0;
87 }
View Code

  9、大数加法

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 const int N = 100;
  6 
  7 class Number
  8 {
  9     int digit[N];//数组指针
 10     int length;//长度
 11     bool sign; //负数为1
 12     
 13 public:    
 14     
 15     Number():length(0), sign(0)
 16     {
 17         memset(digit,0,sizeof(digit));
 18     }
 19     
 20     Number(const char* s)//构造,类型转换
 21     {    
 22         memset(digit,0,sizeof(digit));
 23         if(s[0]=='-'){      //符号
 24             sign=1;
 25             s++;
 26         }
 27         else sign =0;
 28         
 29         length = strlen(s); //长度
 30         
 31         int j=length-1;    
 32         while( *s )         //数组
 33              digit[j--] = *s++ -'0';
 34     }
 35     
 36     int compare( const Number&t )const{ //对象比较
 37         if(this->length==t.length){
 38             int i=t.length-1;
 39             for( ; i>=0; i-- ){
 40                 if(this->digit[i]<t.digit[i])
 41                     return -1; //长度相等字符小返回-1
 42                 else if(this->digit[i]>t.digit[i])
 43                     return 1;  //长度相等字符大返回1
 44             }
 45             if(i<0) //长度字符相等返回0
 46                 return 0;            
 47         }
 48         else if( this->length< t.length )    
 49             return -1; //长度小返回-1
 50         else
 51             return 1;  //长度大返回1
 52     }
 53     
 54     Number add(const Number &t)const  //对象数组相加
 55     {
 56         Number result;        
 57         int len = compare(t)<0 ? t.length: length;
 58         result.length=len;
 59         
 60         for(int i=0; i<len; i++)
 61         {
 62             result.digit[i] += digit[i]+t.digit[i];
 63             result.digit[i+1] += result.digit[i]/10;      //进位
 64             result.digit[i] %= 10;                      //取余
 65         }
 66         if(result.digit[length]!=0) //最高位不是0,长度加1
 67             result.length++;
 68         return result;
 69     }
 70     
 71     Number subtract(const Number &t) const//对象数组相减
 72     {
 73         Number result;
 74         int len = compare(t)<0 ? t.length: this->length;
 75         result.length=len;
 76         
 77         for(int i=0; i<len; i++)
 78         {
 79             result.digit[i] += this->digit[i]-t.digit[i];
 80             if(result.digit[i]<0){
 81                 result.digit[i] += 10; //借位
 82                 result.digit[i+1]--;   //退一
 83             }
 84         }
 85         while( result.length>1 && result.digit[result.length-1]==0 )
 86             result.length--; //最高位为0 长度减1,直到最高位不是0且长度大于1(考虑到结果等于0的情况)
 87         return result;
 88     }
 89     
 90     Number operator+(const Number &t){
 91         Number result;
 92         if(this->sign==t.sign){ //符号一样 直接加
 93             result = add(t);
 94             result.sign= this->sign;
 95         }
 96         else{ //符号不一样
 97             if(compare(t)==0){//相等        
 98                 result = subtract(t);//result.digit[0] = 0;result.length = 1;            
 99                 result.sign= 0;
100             }
101             else {
102                 if(compare(t)<0){
103                     result = t.subtract(*this);
104                     result.sign = t.sign;
105                 }
106                 else if(compare(t)>0){
107                     result = subtract(t);
108                     result.sign = sign;
109                 }
110             }
111         }
112         return result;
113     } 
114     friend ostream& operator << (ostream& o, const Number& t) {
115         if(t.sign) 
116             o << '-';
117         for(int i=t.length-1; i>=0; i--)
118         {
119             o << t.digit[i];
120         }        
121         return o;
122     }
123 };
124 
125 int main()
126 {
127     char str[N];
128     cin >> str;
129     Number a(str);
130     cin >> str;
131     Number b(str);
132     
133     cout << a + b << endl;
134     
135     return 0;
136 }
View Code

  10、大数减法

  1 #include <iostream>
  2 #include <cstring>
  3 using namespace std;
  4 
  5 const int N = 100;
  6 
  7 class Number
  8 {
  9     int digit[N];//数组指针
 10     int length;//长度
 11     bool sign; //负数为1
 12     
 13 public:    
 14     
 15     Number():length(0), sign(0)
 16     {
 17         memset(digit,0,sizeof(digit));
 18     }
 19     
 20     Number(const char* s)//构造,类型转换
 21     {    
 22         memset(digit,0,sizeof(digit));
 23         if(s[0]=='-'){      //符号
 24             sign=1;
 25             s++;
 26         }
 27         else sign =0;
 28         
 29         length = strlen(s); //长度
 30         
 31         int j=length-1;    
 32         while( *s )         //数组
 33              digit[j--] = *s++ -'0';
 34     }
 35     
 36     int compare( const Number&t )const{ //对象比较
 37         if(this->length==t.length){
 38             int i=t.length-1;
 39             for( ; i>=0; i-- ){
 40                 if(this->digit[i]<t.digit[i])
 41                     return -1; //长度相等字符小返回-1
 42                 else if(this->digit[i]>t.digit[i])
 43                     return 1;  //长度相等字符大返回1
 44             }
 45             if(i<0) //长度字符相等返回0
 46                 return 0;            
 47         }
 48         else if( this->length< t.length )    
 49             return -1; //长度小返回-1
 50         else
 51             return 1;  //长度大返回1
 52     }
 53     
 54     Number add(const Number &t)const  //对象数组相加
 55     {
 56         Number result;        
 57         int len = compare(t)<0 ? t.length: length;
 58         result.length=len;
 59         
 60         for(int i=0; i<len; i++)
 61         {
 62             result.digit[i] += digit[i]+t.digit[i];
 63             result.digit[i+1] += result.digit[i]/10;      //进位
 64             result.digit[i] %= 10;                      //取余
 65         }
 66         if(result.digit[length]!=0) //最高位不是0,长度加1
 67             result.length++;
 68         return result;
 69     }
 70     
 71     Number subtract(const Number &t) const//对象数组相减
 72     {
 73         Number result;
 74         int len = compare(t)<0 ? t.length: this->length;
 75         result.length=len;
 76         
 77         for(int i=0; i<len; i++)
 78         {
 79             result.digit[i] += this->digit[i]-t.digit[i];
 80             if(result.digit[i]<0){
 81                 result.digit[i] += 10; //借位
 82                 result.digit[i+1]--;   //退一
 83             }
 84         }
 85         while( result.length>1 && result.digit[result.length-1]==0 )
 86             result.length--; //最高位为0 长度减1,直到最高位不是0且长度大于1(考虑到结果等于0的情况)
 87         return result;
 88     }
 89     
 90     Number operator-(const Number &t){ //重载-
 91         Number result;
 92         //1.符号一样
 93         if(this->sign==t.sign){ 
 94             if(t.sign==1)
 95             { //都为负数                
 96                 if( compare(t)<0 ||compare(t)==0){                    
 97                     result = t.subtract(*this);
 98                     result.sign = 0;
 99                 }
100                 else{
101                     result = subtract(t);
102                     result.sign = 1;
103                 }        
104             }
105             else//都为正数
106             {
107                 if(compare(t)<0){
108                     result = t.subtract(*this);
109                     result.sign = 1;
110                 }
111                 else{
112                     result = subtract(t);
113                     result.sign= 0;
114                 }                
115             }            
116         }
117         //2.符号不一样
118         else{               
119             result = add(t);
120             result.sign = this->sign;
121         }
122             
123         return result;
124     }
125     
126     friend ostream& operator << (ostream& o, const Number& t) {
127         if(t.sign) 
128             o << '-';
129         for(int i=t.length-1; i>=0; i--)
130         {
131             o << t.digit[i];
132         }        
133         return o;
134     }
135 };
136 
137 int main()
138 {
139     char str[N];
140     cin >> str;
141     Number a(str);
142     cin >> str;
143     Number b(str);
144     
145     cout << a - b << endl;
146     
147     return 0;
148 }
View Code

  NOJ练习八

  1、三角形

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 class Point{
 6     double x;
 7     double y;
 8 public:
 9     Point(double x = 0.0, double y = 0.0){
10         this->x = x;
11         this->y = y;
12     }
13     double getX()const{
14         return x;
15     }
16     double getY()const{
17         return y;
18     }
19 };
20 
21 class Triangle{
22     Point p1,p2,p3;
23     double lengthOfTwoPoint(const Point& p1, const Point& p2){
24         return sqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX()) + 
25             (p1.getY()-p2.getY())*(p1.getY()-p2.getY()) );
26     }
27 public:
28     Triangle(const Point& p1, const Point& p2, const Point& p3){
29         if(isTriangle(p1,p2,p3))
30         {
31             this->p1 = p1;
32             this->p2 = p2;
33             this->p3 = p3;
34         }        
35     }
36     bool isTriangle(const Point& p1, const Point& p2, const Point& p3){
37         if( lengthOfTwoPoint(p1,p2)+lengthOfTwoPoint(p1,p3)>lengthOfTwoPoint(p2,p3)&&
38             lengthOfTwoPoint(p2,p1)+lengthOfTwoPoint(p2,p3)>lengthOfTwoPoint(p1,p3)&&
39             lengthOfTwoPoint(p3,p1)+lengthOfTwoPoint(p3,p2)>lengthOfTwoPoint(p1,p2)
40             ){
41             cout << "YES" << endl;    
42             return true;
43         }
44         cout << "NO" << endl;    
45         return false;
46     }
47 };
48 
49 int main()
50 {
51     double x1,y1,x2,y2,x3,y3;
52     cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
53     Point p1(x1,y1),p2(x2,y2),p3(x3,y3);
54     Triangle t(p1,p2,p3);    
55     return 0;
56 }
View Code

  2、薪酬

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N = 128;
 6 class Employee{
 7     char no[N];
 8     char name[N];
 9     int salary;
10 public:
11     Employee(const char* no,const char* name,int salary):
12         salary(salary){                
13         strcpy(this->no,no);
14         strcpy(this->name,name); 
15     }
16     const char* getNo()const{
17         return no;
18     }
19     const char* getName()const{
20         return name;
21     }
22     const int getSalary()const{
23         return salary;
24     }
25 };
26 class Salesman:public Employee{
27 public:
28     Salesman(const char* no,const char* name,int salary):Employee(no,name,salary){}
29     void print(){
30         cout << getNo() << " " << getName() << " " << getSalary() << endl;
31     }
32 };
33 class Salesmanager:public Salesman{
34     int com;
35 public:
36     Salesmanager(const char* no,const char* name,int salary,int com):
37         Salesman(no,name,salary+com/100),com(com){  }
38     void print(){
39         Salesman::print();
40     }
41 };
42 
43 int main()
44 {
45     char no[N];
46     char name[N];
47     int salary;
48     int com;
49     
50     scanf("%s%s%d",&no,&name,&salary);
51     Salesman sman(no,name,salary);
52     scanf("%s%s%d%d",&no,&name,&salary,&com);
53     Salesmanager smanager(no,name,salary,com);
54     
55     sman.print();
56     smanager.print();
57     return 0;
58 }
View Code

  3、时间间隔

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 
 5 class Time{
 6     int hour;
 7     int minute;
 8     int second;
 9 public:
10     Time(int hour=0, int minute=0, int second=0){
11         this->hour = hour;
12         this->minute = minute;
13         this->second = second;
14     }
15     void setTime(int hour, int minute, int second){
16         this->hour = hour;
17         this->minute = minute;
18         this->second = second;
19     }
20     void showTime(){
21         printf("%02d:%02d:%02d\n",hour, minute, second);
22     }
23     int getHour()const{
24         return hour;
25     }
26     int getMinute()const{
27         return minute;
28     }
29     int getSecond()const{
30         return second;
31     }
32 };
33 
34 class Interval{
35     Time t1;
36     Time t2;
37 public:
38     Interval(const Time&t1,const Time&t2):t1(t1),t2(t2){}
39     void showInerval(){     
40         int s1 = t1.getHour()*3600+t1.getMinute()*60+t1.getSecond() ;
41         int s2 = t2.getHour()*3600+t2.getMinute()*60+t2.getSecond();
42         
43         int s = abs(s2-s1); //两个时间相差的秒数
44         
45         int hour = s/3600;
46         int minute = s%3600/60;
47         int second = s%3600%60;
48         
49         Time(hour,minute,second).showTime();
50     }
51 };
52 int main()
53 {
54     int h,m,s;
55     Time t1,t2;
56     
57     scanf("%d:%d:%d",&h,&m, &s);
58     t1.setTime(h,m,s);
59     scanf("%d:%d:%d",&h,&m, &s);
60     t2.setTime(h,m,s);
61     
62     Interval i(t1,t2);
63     i.showInerval();
64     return 0;
65 }
View Code

  4、面积

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const double PI = 3.1415926;
 5 
 6 class Shape{
 7 public:
 8     virtual double area() = 0;
 9     virtual~Shape(){}
10 };
11 
12 class Circle:public Shape{
13     double r;
14 public:
15     Circle(double r):r(r){ }
16     double area(){
17         return PI*r*r;
18     }
19 };
20 
21 class Rectangle:public Shape{
22     double l,w;
23 public:
24     Rectangle(double l,double w):l(l),w(w){ }
25     double area(){
26         return l*w;
27     }
28 };
29 
30 class Trapezoid:public Shape{
31     double l,w,h;
32 public:
33     Trapezoid(double l,double w,double h):l(l),w(w),h(h){ }
34     double area(){
35         return (l+w)*h/2;
36     }
37 };
38 
39 class Triangle:public Shape{
40     double s,h;
41 public:
42     Triangle(double s,double h):s(s),h(h){ }
43     double area(){
44         return 0.5*s*h;
45     }
46 };
47 
48 void shapeArea( Shape* sp )
49 {
50     if(sp){
51         printf( "%.2f\n",sp->area() );
52         delete sp;
53     }    
54 }
55 
56 int main()
57 {
58     double r,l,w,h;
59     
60     scanf("%lf",&r);
61     shapeArea( new Circle(r));
62     
63     scanf("%lf%lf", &l,&w);
64     shapeArea( new Rectangle(l,w) );
65     
66     scanf("%lf%lf%lf", &l,&w,&h);
67     shapeArea ( new Trapezoid(l,w,h));
68     
69     scanf("%lf%lf", &l,&h);
70     shapeArea( new Triangle(l,h));
71     
72     return 0;
73 }
View Code

  5、时钟

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Clock{
 5     int hour;
 6     int minute;
 7     int second;
 8 public:
 9     Clock& operator++(){
10         if(++second >= 60){
11             second -= 60;
12             minute++;
13         }
14         if(minute >= 60){
15             minute -= 60;
16             hour++;
17         }
18         hour %= 24;
19         return *this;
20     }
21     Clock operator++(int){ //后置++
22         Clock c = *this;
23         if(++second >= 60){
24             second -= 60;
25             minute++;
26         }
27         if(minute >= 60){
28             minute -= 60;
29             hour++;
30         }
31         hour %= 24;
32         return c;
33     }
34         Clock& operator--(){
35         if(--second <0){
36             second += 60;
37             minute--;
38         }
39         if(minute < 0){
40             minute += 60;
41             hour--;
42         }
43         if(hour < 0)
44             hour += 24;
45         return *this;
46     }
47     Clock operator--(int){ //后置--
48         Clock c = *this;
49         if(--second <0){
50             second += 60;
51             minute--;
52         }
53         if(minute < 0){
54             minute += 60;
55             hour--;
56         }
57         if(hour < 0)
58             hour += 24;
59         return c;
60     }
61     void SetTime(int hour, int minute, int second){
62         this->hour = hour;
63         this->minute = minute;
64         this->second = second;
65     }
66     void ShowTime(){
67         printf("%02d:%02d:%02d\n",hour, minute, second);
68     }
69 };
70 
71 int main()
72 {
73     int n;
74     int h,m,s;
75     scanf("%d:%d:%d",&h,&m, &s);
76     
77     Clock t1,t2;
78     t1.SetTime(h,m,s);
79     
80     scanf("%d",&n);
81     switch(n){
82         case 1: t2=t1++; t1.ShowTime(); t2.ShowTime();break;
83         case 2: t2=t1--; t1.ShowTime(); t2.ShowTime();break;
84         case 3: t2=++t1; t1.ShowTime(); t2.ShowTime();break;
85         case 4: t2=--t1; t1.ShowTime(); t2.ShowTime();break;        
86     }    
87     return 0;
88
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++程序设计课程配套课件,西北工业大学-中国大学mooc平台课程,PPT很不错。 程序设计课程是大学计算机基础教育和计算机科学与技术专业基础的核心课程,是数据结构、算法设计、数学建模、软件技术等课程的前导课程。程序设计课程的教学目标是使学生能够使用一种开发工具熟练的进行软件开发,为学生将来的创新实验、毕业设计、科学研究提供了有力的技术支持。 C++是国内外广泛使用的计算机程序设计语言。其功能强大、面向对象、数据表示丰富、代码运行效率高、可移植性好,适合编写系统软件和各类应用程序。在TIOBE排行榜上,C++语言多年来始终处于前五位。学习程序设计C++入手,对于培养利用计算机求解现实问题的计算思维能力具有其他语言无法比拟的有点。且在完全掌握了C++语言之后,再学习其他程序设计语言就会轻车熟路了。 C是C++的子集,因此在C++的授课中,有至少一半的内容是和C语言一样的。而国内C++程序设计课程的学时普遍较少,且讲授的重点一般都放在和C重叠的那一部分。对于C++比C多出来的内容往往只介绍类、继承等基本概念,而对于重载、多态、异常处理、数据流等内容言之甚少。本课程即针对这一问题,增加了C++独有的内容的比重,不但适用于在校大学生,且适用于工作中使用C++进行软件开发的人。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值