1、简单输出整数
本题要求实现一个函数,对给定的正整数N
,打印从1到N
的全部正整数。
1 #include <stdio.h> 2 void PrintN ( int N ); 3 int main () 4 { 5 int N; 6 scanf("%d", &N); 7 PrintN( N ); 8 return 0; 9 } 10 void PrintN ( int N ){ 11 for(int i=1; i<=N; ++i) 12 printf("%d ",i); 13 }
2、多项式求值
本题要求实现一个函数,计算阶数为n
,系数为a[0]
... a[n]
的多项式f(x)=∑i=0n(a[i]×xi) 在x
点的值。
1 #include <stdio.h> 2 3 #define MAXN 10 4 5 double f( int n, double a[], double x ); 6 7 int main() 8 { 9 int n, i; 10 double a[MAXN], x; 11 12 scanf("%d %lf", &n, &x); 13 for ( i=0; i<=n; i++ ) 14 scanf(“%lf”, &a[i]); 15 printf("%.1f ", f(n, a, x)); 16 return 0; 17 } 18 double f( int n, double a[], double x ){ 19 double sum = 0; 20 for(int i=0; i<=n; ++i){ 21 sum += a[i]*pow(x,i); 22 } 23 return sum; 24 }
3、简单求和
本题要求实现一个函数,求给定的N
个整数的和。
1 #include <stdio.h> 2 3 #define MAXN 10 4 5 int Sum ( int List[], int N ); 6 7 int main () 8 { 9 int List[MAXN], N, i; 10 11 scanf("%d", &N); 12 for ( i=0; i<N; i++ ) 13 scanf("%d", &List[i]); 14 printf("%d ", Sum(List, N)); 15 16 return 0; 17 } 18 int Sum ( int List[], int N ){ 19 int sum=0; 20 for(int i=0; i<N; ++i) 21 sum += List[i]; 22 return sum; 23 }
4、求自定类型元素的平均
本题要求实现一个函数,求N
个集合元素S[]
的平均值,其中集合元素的类型为自定义的ElementType
。
1 #include <stdio.h> 2 3 #define MAXN 10 4 typedef float ElementType; 5 6 ElementType Average( ElementType S[], int N ); 7 8 int main () 9 { 10 ElementType S[MAXN]; 11 int N, i; 12 13 scanf("%d", &N); 14 for ( i=0; i<N; i++ ) 15 scanf("%f", &S[i]); 16 printf("%.2f ", Average(S, N)); 17 18 return 0; 19 } 20 ElementType Average( ElementType S[], int N ){ 21 ElementType sum = 0; 22 for(int i=0; i<N; ++i) 23 sum +=S[i]; 24 return sum/N; 25 }
5、求自定类型元素的最大值
本题要求实现一个函数,求N
个集合元素S[]
中的最大值,其中集合元素的类型为自定义的ElementType
。
1 #include <stdio.h> 2 3 #define MAXN 10 4 typedef float ElementType; 5 6 ElementType Max( ElementType S[], int N ); 7 8 int main () 9 { 10 ElementType S[MAXN]; 11 int N, i; 12 13 scanf("%d", &N); 14 for ( i=0; i<N; i++ ) 15 scanf("%f", &S[i]); 16 printf("%.2f ", Max(S, N)); 17 18 return 0; 19 } 20 ElementType Max( ElementType S[], int N ){ 21 ElementType max = S[0]; 22 for(int i=1; i<N; ++i) 23 if(max < S[i]) 24 max = S[i]; 25 return max; 26 }
6、求单链表结点的阶乘和
本题要求实现一个函数,求单链表L
结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int
范围内。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct Node *PtrToNode; 5 struct Node { 6 int Data; /* 存储结点数据 */ 7 PtrToNode Next; /* 指向下一个结点的指针 */ 8 }; 9 typedef PtrToNode List; /* 定义单链表类型 */ 10 11 int FactorialSum( List L ); 12 13 int main() 14 { 15 int N, i; 16 List L, p; 17 18 scanf("%d", &N); 19 L = NULL; 20 for ( i=0; i<N; i++ ) { 21 p = (List)malloc(sizeof(struct Node)); 22 scanf("%d", &p->Data); 23 p->Next = L; L = p; 24 } 25 printf("%d ", FactorialSum(L)); 26 27 return 0; 28 } 29 int FactorialSum( List L ){ 30 int sum = 0; 31 while(L) 32 { 33 int fac=1; 34 for(int i=1; i<=L->Data; ++i) fac *= i; 35 sum += fac; 36 L = L->Next; 37 } 38 return sum; 39 }
7、 统计某类完全平方数
本题要求实现一个函数,判断任一给定整数N
是否满足条件:它是完全平方数,又至少有两位数字相同,如144、676等。
1 #include <stdio.h> 2 #include <math.h> 3 4 int IsTheNumber ( const int N ); 5 6 int main() 7 { 8 int n1, n2, i, cnt; 9 10 scanf("%d %d", &n1, &n2); 11 cnt = 0; 12 for ( i=n1; i<=n2; i++ ) { 13 if ( IsTheNumber(i) ) 14 cnt++; 15 } 16 printf("cnt = %d ", cnt); 17 18 return 0; 19 } 20 int IsTheNumber ( const int N ){ 21 int i,ret=0; 22 for (i = 0; i <= N / 2; i++) 23 if (i*i == N){ 24 ret++; 25 break; 26 } 27 int key[10] = {0}; 28 int t = N; 29 while(t) 30 { 31 key[t%10]++; 32 t /= 10; 33 } 34 for(int j=0; j<=9; ++j) 35 if(key[j]>=2){ 36 ret++; 37 break; 38 } 39 return ret == 2; 40 }
8、简单阶乘计算
本题要求实现一个计算非负整数阶乘的简单函数。
1 #include <stdio.h> 2 3 int Factorial( const int N ); 4 5 int main() 6 { 7 int N, NF; 8 9 scanf("%d", &N); 10 NF = Factorial(N); 11 if (NF) printf("%d! = %d ", N, NF); 12 else printf("Invalid input "); 13 14 return 0; 15 } 16 int Factorial( const int N ){ 17 if(N<0) return 0; 18 int fac=1; 19 for(int i=1; i<=N; ++i) 20 fac *=i; 21 return fac; 22 }
9、统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。
1 #include <stdio.h> 2 3 int Count_Digit ( const int N, const int D ); 4 5 int main() 6 { 7 int N, D; 8 9 scanf("%d %d", &N, &D); 10 printf("%d ", Count_Digit(N, D)); 11 return 0; 12 } 13 int Count_Digit ( const int N, const int D ){ 14 if(!N&&!D) return 1; 15 int count=0,t = N; 16 if(t<0) t = -t; 17 while(t) 18 { 19 if(t%10==D) 20 count++; 21 t /= 10; 22 } 23 return count; 24 }
10、阶乘计算升级版
本题要求实现一个打印非负整数阶乘的函数。
1 #include <stdio.h> 2 3 void Print_Factorial ( const int N ); 4 5 int main() 6 { 7 int N; 8 9 scanf("%d", &N); 10 Print_Factorial(N); 11 return 0; 12 } 13 void Print_Factorial ( const int N ){ 14 if(N<0){ 15 printf("Invalid input"); 16 return; 17 } 18 int a[100000] = {0,1},index=1; 19 for(int n = 1; n<=N; ++n) 20 { 21 int carry = 0;/**< 进位数 */ 22 for(int j=1; j<=index; j++)/**< 乘数与被乘数,从第一位开始,逐位相乘 */ 23 { 24 int temp = n*a[j] + carry;/**< 乘积 + 进位数 */ 25 a[j] = temp%10;/**< 乘积 + 进位数,保留个位 */ 26 carry = temp/10;/**< 进位 */ 27 } 28 while(carry > 0)/**< 进位数大于0,最高位++,最高位保留进位数个位 */ 29 { 30 a[++index] = carry%10; 31 carry /= 10; 32 } 33 } 34 for(int i=index; i>0;--i) 35 printf("%d",a[i]); 36 }
11、求自定类型元素序列的中位数
本题要求实现一个函数,求N
个集合元素A[]
的中位数,即序列中第⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的ElementType
1 #include <stdio.h> 2 3 #define MAXN 10 4 typedef float ElementType; 5 6 ElementType Median( ElementType A[], int N ); 7 8 int main () 9 { 10 ElementType A[MAXN]; 11 int N, i; 12 13 scanf("%d", &N); 14 for ( i=0; i<N; i++ ) 15 scanf("%f", &A[i]); 16 printf("%.2f ", Median(A, N)); 17 18 return 0; 19 } 20 void HeapAdjust(ElementType array[], int i, int nlength) 21 { 22 ElementType nTemp; 23 for (int nChild; 2 * i + 1 < nlength; i = nChild) 24 { 25 nChild = 2 * i + 1; 26 //得到子节点中较大的节点 27 if (nChild < nlength - 1 && array[nChild + 1] > array[nChild]) 28 nChild++; 29 //如果较大的子节点大于父节点那么把较大的子节点往上移动,替换它的父节点 30 if (array[i] < array[nChild]) 31 { 32 nTemp = array[i]; 33 array[i] = array[nChild]; 34 array[nChild] = nTemp; 35 } 36 else 37 break; 38 } 39 } 40 void Heapsort(ElementType array[], int length) 41 { 42 int i;//调整序列的前半部分元素,调整完之后第一个元素是序列的最大元素 43 ElementType temp; 44 for (i = length/2 - 1; i >= 0; i--) 45 HeapAdjust(array, i, length); 46 //从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素 47 for (i = length - 1; i >= 0; i--) 48 { 49 //把第一个元素和当前的最后一个元素交换 50 //保证当前的最后一个位置的元素都是现在这个序列中最大的 51 temp = array[0]; 52 array[0] = array[i]; 53 array[i] = temp; 54 //不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值 55 HeapAdjust(array, 0, i); 56 } 57 } 58 ElementType Median(ElementType A[], int N) 59 { 60 Heapsort(A, N); 61 return A[N / 2]; 62 }
12、判断奇偶性
本题要求实现判断给定整数奇偶性的函数。
1 #include <stdio.h> 2 3 int even( int n ); 4 5 int main() 6 { 7 int n; 8 9 scanf("%d", &n); 10 if (even(n)) 11 printf("%d is even. ", n); 12 else 13 printf("%d is odd. ", n); 14 15 return 0; 16 } 17 int even( int n ){ 18 if(n%2) 19 return 0; 20 return 1; 21 }
13、折半查找
给一个严格递增数列,函数int Search_Bin(SSTable T, KeyType k)用来二分地查找k在数列中的位置。
1 #include <iostream> 2 using namespace std; 3 4 #define MAXSIZE 50 5 typedef int KeyType; 6 7 typedef struct 8 { 9 KeyType key; 10 } ElemType; 11 12 typedef struct 13 { 14 ElemType *R; 15 int length; 16 } SSTable; 17 18 void Create(SSTable &T) 19 { 20 int i; 21 T.R=new ElemType[MAXSIZE+1]; 22 cin>>T.length; 23 for(i=1;i<=T.length;i++) 24 cin>>T.R[i].key; 25 } 26 27 int Search_Bin(SSTable T, KeyType k); 28 29 int main () 30 { 31 SSTable T; KeyType k; 32 Create(T); 33 cin>>k; 34 int pos=Search_Bin(T,k); 35 if(pos==0) cout<<"NOT FOUND"<<endl; 36 else cout<<pos<<endl; 37 return 0; 38 } 39 int Search_Bin(SSTable T, KeyType k){ 40 int left, right, mid, NotFound=0; 41 left = 1; /*初始左边界*/ 42 right = T.length; /*初始右边界*/ 43 while ( left <= right ) 44 { 45 mid = (left+right)/2; /*计算中间元素坐标*/ 46 if( k < T.R[mid].key) right = mid-1; /*调整右边界*/ 47 else if( k > T.R[mid].key) left = mid+1; /*调整左边界*/ 48 else return mid; /*查找成功,返回数据元素的下标*/ 49 } 50 return NotFound; /*查找不成功,返回-1*/ 51 }