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

Posted on 2022-05-01 16:54  金色的省略号  阅读(973)  评论(0编辑  收藏  举报

  已过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 }
View Code